net6 的Web MVC项目中事务功能的应用

主要原理是借助于ActionFilter过滤器对Action方法实现拦截,再加上TransactionScope事务处理功能,实现Action方法的事务功能。

1、实现IAsyncActionFilter接口,定义事务拦截器。

public class TransactionScopeFilter : IAsyncActionFilter
{
        public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
        {
            bool hasNotTransactionalAttribute = false;//action上是否标识不启用事务功能
            if (context.ActionDescriptor is ControllerActionDescriptor)
            {
                var actionDesc = (ControllerActionDescriptor)context.ActionDescriptor;
                hasNotTransactionalAttribute = actionDesc.MethodInfo.IsDefined(typeof(NotTransactionalAttribute), false);
            }
            if (hasNotTransactionalAttribute)
            {
                await next();
                return;
            }

            using var txScope = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled);
            var result = await next();
            if (result.Exception == null)//action执行结果没有异常则提交事务
            {
                txScope.Complete();
            }
        }
}

2、注册拦截器。

需要在Startup.cs代码中注册我们自定义的拦截器。

public void ConfigureServices(IServiceCollection services)
{
            services.AddControllers();
            services.AddMvcCore(opt => {
                opt.Filters.Add<RateLimitFilter>();//添加限流支持
                opt.Filters.Add<TransactionScopeFilter>();//添加事务支持
                opt.Filters.Add<ExceptionFilter>();//添加异常处理支持
                opt.Filters.Add<LogFilter>();
            });
            services.AddDbContext<BookDbContext>(opt=> {
                var connectString = this.Configuration.GetSection("DbConnectionStr").Value;
                opt.UseSqlServer(connectString);
            });
            services.AddSwaggerGen(c =>
            {
                c.SwaggerDoc("v1", new OpenApiInfo { Title = "WebApplication1", Version = "v1" });
            });
            services.AddMemoryCache();//添加缓存服务
}

这样我们的action方法默认全部是支持事务功能的,如果不希望action添加事务支持,只需要在action方法上增加特性NotTransactional就可以了,这个是我自定义的一个标记特性。

public class NotTransactionalAttribute:Attribute
{
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值