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

2022-04-14 21:22:07
目录
一、发布端事务二、消费端事务1、创建一个 CAP 过滤器2、配置过滤器

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

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

一、发布端事务

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

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

public class CapTransactionFilterAttribute : TypeFilterAttribute{    public CapTransFilter    {        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)        {www.easck.com            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 OnSubscribeExecutfeLPhBvuesed(ExecutedContext context)    {        _transaction.Commit();    }    public override void OnSubscribeException(DotNetCore.CAP.Filter.ExceptionContext context)    {       _transaction.Rollback();    }}

2、配置过滤器

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

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