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


    本篇文章旨在描述如何在 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>();
    

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


    本文地址:http://www.cnblogs.com/savorboard/p/cap-auto-transaction.html
    作者博客:Savorboard
    本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本

  • 相关阅读:
    PHP算法每日一练 双向链表
    Web开发者必备的十大免费在线工具网站
    使用PXE+DHCP+Apache+Kickstart无人值守安装CentOS5.5
    linux服务器状态、性能相关命令
    PHP算法每日一练 单链表
    [转]DELPHI2006中for in语句的应用
    [转]Delphi线程类
    [转]解耦:Delphi下IoC 模式的实现
    [DELPHI]单例模式(singleton) 陈省
    [转][Delphi]解决窗体闪烁的方法
  • 原文地址:https://www.cnblogs.com/savorboard/p/cap-auto-transaction.html
Copyright © 2020-2023  润新知