在 ASP.NET Core 中自动启用 CAP 事务详情

 更新时间:2021年10月11日 15:29:44   作者:杨晓东  
本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要基于 Entity Framework 来进行演示

本篇文章旨在描述如何在 ASP.NET Core项目中并以一种简便的方式启用CAP事务,因为在我们的示例中都是直接演示比较直观的方式,没有进行封装,有些初学者同学不太会,找到问我如何封装,本篇文章主要是一个简单的演示。

在本示例中 ,我们主要是基于 Entity Framework 来进行演示,如果你使用其他 Orm 原理类似,大家参考即可。

一、发布端事务

由于大部分人都是在 Web 中使用,所以可以通过使用 ASP.NET Core 过滤器的方式进行,当然也可以通过中间件,原理是一致的。

1、创建一个 TypeFilter,命名为 CapTransactionFilterAttribute

public class CapTransactionFilterAttribute : TypeFilterAttribute
{
    public CapTransactionFilterAttribute() : base(typeof(TransactionActionFilter))
    {

    }

    public class TransactionActionFilter : IActionFilter
    {
        private IDbContextTransaction _transaction;

        public void OnActionExecuting(ActionExecutingContext context)
        {
            var dbContext = context.HttpContext.RequestServices.GetRequiredService<AppDbContext>();
            var capPublisher = context.HttpContext.RequestServices.GetService<ICapPublisher>();
            _transaction = dbContext.Database.BeginTransaction(capPublisher);
        }

        public void OnActionExecuted(ActionExecutedContext context)
        {
            if (context.Exception == null)
            {
                _transaction.Commit();
            }
            else
            {
                _transaction.Rollback();
            }

            _transaction?.Dispose();
        }
    }
}

2、使用方式,在需要进行事务控制的 Action 上添加 [TypeFilter(typeof(CapTransactionFilterAttribute))] 即可生效。

[Route("~/ef/trans-filter")]
[TypeFilter(typeof(CapTransactionFilterAttribute))]
public IActionResult EntityFrameworkWithTransactionFilter(
    [FromServices] AppDbContext dbContext)
{
    dbContext.Persons.Add(new Person() { Name = "ef.transaction" });

    _capBus.Publish("sample.rabbitmq.mysql", DateTime.Now);

    dbContext.SaveChanges();

    return Ok();
}

二、消费端事务

消费端自动事务主要利用 CAP 提供的过滤器来进行开启,需要 CAP 版本大于 5.1.0。

1、创建一个 CAP 过滤器

public class MyCapFilter : SubscribeFilter
{
    private readonly AppDbContext _dbContext;
    private IDbContextTransaction _transaction;

    public MyCapFilter(AppDbContext dbContext)
    {
        _dbContext = dbContext;
    }

    public override void OnSubscribeExecuting(ExecutingContext context)
    {
        _transaction = _dbContext.Database.BeginTransaction();
    }

    public override void OnSubscribeExecuted(ExecutedContext context)
    {
        _transaction.Commit();
    }

    public override void OnSubscribeException(DotNetCore.CAP.Filter.ExceptionContext context)
    {
       _transaction.Rollback();
    }
}

2、配置过滤器

services.AddCap(opt =>
{
    // ***
}.AddSubscribeFilter<MyCapFilter>();

以上就是消费端的一个简单示例。

到此这篇关于在 ASP.NET Core 中自动启用 CAP 事务详情的文章就介绍到这了,更多相关在 ASP.NET Core 中自动启用 CAP 事务内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • .NET项目在k8s中运行的Dapr持续集成流程

    .NET项目在k8s中运行的Dapr持续集成流程

    这篇文章主要介绍了.NET项目在k8s中运行的Dapr持续集成流程,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步早日升职加薪
    2022-04-04
  • 在NET Core 中获取 CPU 使用率

    在NET Core 中获取 CPU 使用率

    这篇文章我们分享一种如何在 .NETCore 中获取 CPU使用率的方法, 它所报告的这个值和 任务管理器 中报告的 CPU 使用值 差不多是一致的,下面来看看文中的具体详细介绍吧
    2022-01-01
  • 修改 asp.net core 5 程序的默认端口号

    修改 asp.net core 5 程序的默认端口号

    这篇文章主要介绍了修改 asp.net core 5 程序的默认端口号,我们知道可以通过修改 launchSettings.json 文件中的端口号来实现端口切换,下面来看看具体的修改过程吧
    2022-01-01
  • .NET6新特性之 隐式命名空间引用

    .NET6新特性之 隐式命名空间引用

    本文给大家分享的是 .NET6特新 隐式命名空间引用,如果我们要在新加一个命名空间的引用,可以在项目文件中配置增加<Using Include="命名空间"/>,如果需要移除一个命名空间可以这么做<Using Remove="命名空间"/>,下面来看看文章详细介绍内容吧,需要的朋友可以参考一下
    2021-11-11
  • ASP.NET Web API教程 创建Admin视图详细介绍

    ASP.NET Web API教程 创建Admin视图详细介绍

    现在我们转入客户端,并添加一个能够使用从Admin控制器而来的数据的页面。通过给控制器发送AJAX请求的方式,该页面将允许用户创建、编辑,或删除产品
    2012-11-11
  • ASP.NET Core MVC 依赖注入View与Controller

    ASP.NET Core MVC 依赖注入View与Controller

    本文重点给大家介绍的是ASP.NET Core MVC 之依赖注入 View 和ASP.NET Core MVC 之依赖注入 Controller的相关资料,需要的小伙伴可以参考下面文章具体内容
    2021-09-09
  • Oracle中TO_DATE格式介绍

    Oracle中TO_DATE格式介绍

    Oracle中TO_DATE格式介绍;可供需求的朋友参考
    2012-11-11
  • 利用ASP.NET技术动态生成HTML页面

    利用ASP.NET技术动态生成HTML页面

    利用ASP.NET技术动态生成HTML页面...
    2006-07-07
  • ASP.net中md5加密码的方法

    ASP.net中md5加密码的方法

    ASP.net中md5加密码的方法...
    2006-07-07
  • .NET Core 中对象池 Object Pool的使用

    .NET Core 中对象池 Object Pool的使用

    这篇文章主要介绍了 .NET Core 中对象池 Object Pool的使用,对象池简单来说就是一种为对象提供可复用能力的软件设计思路,对象池最常用的场景是游戏设计,因为在游戏中大量存在着可复用的对象,源源不断的子弹出现并不是循环再生的,下面一起进入文章了解具体内容吧
    2021-11-11

最新评论