我是靠谱客的博主 直率小懒猪,最近开发中收集的这篇文章主要介绍在 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 事务内容请搜索靠谱客以前的文章或继续浏览下面的相关文章希望大家以后多多支持靠谱客!

最后

以上就是直率小懒猪为你收集整理的在 ASP.NET Core 中自动启用 CAP 事务详情的全部内容,希望文章能够帮你解决在 ASP.NET Core 中自动启用 CAP 事务详情所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(124)

评论列表共有 0 条评论

立即
投稿
返回
顶部