在 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>();

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

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

猜你在找的在 ASP.NET Core 中自动启用 CAP 事务详情相关文章

ASP.NET Core 依赖注入,ASP.NET Core 应用在启动过程中会依赖各种组件提供服务,这些组件会以接口的形式标准化,这些组件就是我们所说的服务,ASP.NET Core框架建立在一个底层的依赖注入框架之上,它使用容器提供所需的服务,下面我们就来详细了解一下
还记得上篇文章中最后提及到,假如服务越来越多怎么处理呢,本篇文章将会带来解决办法, ASP.NET Core 依赖注入框架的相关资料,需要的小伙伴可以参考下面文章的具体内容
东方夜雀食堂人间之里章节怎么通关?游戏中不同章节基本都是采集或是开店,第二章是人里,这里给大家带来了东方夜雀食堂第二关过关技巧,一起来看下文中具体玩法吧。
审判之逝湮灭的记忆最终boss是谁?本作中的最终boss桑名仁有着一段不为人知的过去,很多玩家都想了解一二,下面小编就为大家带来审判之逝湮灭的记忆最终boss桑名仁介绍,一起来看看吧。
超级机器人大战30官网是什么?本作将在10月28日正式上线,预购还在进行中,为了便于大家了解更多游戏内容,这里给大家带来了超级机器人大战30官网地址分享,喜欢的可以看看。
生化危机3重制版有哪些丧尸?生化危机3重制版的难度相比之前的生化危机2重制版要简单不少,流程比较一本道,没有什么困难的谜题,但是仍然需要玩家练习,下面小编就带来生化危机3重制版丧尸应对方法推荐,一起来看看吧。
塞尔达传说荒野之息附魔是什么?当我们在海拉鲁大地上的冒险过程中,有没有发现什么时候,突然间捡到的武器多了一些花里胡哨的描述。比如:“攻击力提升”、“耐力提升”,下面小编就带来塞尔达传说荒野之息附魔玩法介绍,一起来看看吧。
生化危机3重制版一共有多少种武器?游戏中存在各种枪械,每种枪械对应不同的弹药,要根据面对的情况即时切换。下面小编就带来生化危机3重制版武器种类汇总,一起来看看吧。
战地2042狙击枪好用吗?狙击枪是战地里非常热门的枪械,也是很多玩家都喜欢使用的枪械,下面小编就带来战地2042b测狙击枪全面解析,一起来看看吧。
塞尔达传说荒野之息旅行商人在哪?在海拉鲁大陆上,存在着这么一群人,他们来无影去无踪,神龙见首不见尾,但在他们手中却掌握着大部分实用的道具。他们就是旅行商人。下面小编就带来塞尔达传说荒野之息旅行商人介绍,一起来看看吧。