千家信息网

在ASP.NET Core中如何自动启用CAP事务

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,小编给大家分享一下在ASP.NET Core中如何自动启用CAP事务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!一、发布
千家信息网最后更新 2025年01月20日在ASP.NET Core中如何自动启用CAP事务

小编给大家分享一下在ASP.NET Core中如何自动启用CAP事务,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

一、发布端事务

由于大部分人都是在 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();            var capPublisher = context.HttpContext.RequestServices.GetService();            _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();

以上是"在ASP.NET Core中如何自动启用CAP事务"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0