zoukankan      html  css  js  c++  java
  • 在 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
    本文原创授权为:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本

  • 相关阅读:
    Nand flash uboot 命令详解【转】
    uboot命令分析+实现【转】
    UBoot常用命令手册
    第一个Linux驱动-流水灯【转】
    lcd ram/半反穿技术解析【转】
    使用 .gitignore来忽略某些文件【转】
    git常见操作--忽略文件以及常用命令【转】
    Git忽略文件方法【转】
    Git查看、删除、重命名远程分支和tag【转】
    SPA与DPA 攻击【转】
  • 原文地址:https://www.cnblogs.com/savorboard/p/cap-auto-transaction.html
Copyright © 2011-2022 走看看