欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-25 10:33:20
目录1、创建一个 cap 过滤器本篇文章旨在描述如何在 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 事务内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!