• .Net Core2.0基于DbContext,IActionFilter过滤器实现全局UOW,不使用TransactionScope


    抛弃TransactionScope

    之前实现过类似功能是使用的TransactionScope,总碰到这样那样的问题,新项目迁移到.net core2.0下,果断抛弃之前的写法,因为DbContext的SaveChanges方法已经实现了UOW的功能

    定义UOW

    public interface IUnitOfWork
        {
            /// <summary>
            /// 提交事务
            /// </summary>
            /// <returns>受影响行数</returns>
            int Commit();
        }
     public class UnitOfWork : IUnitOfWork
        {
            private readonly IDbContext _context;
    
            public UnitOfWork( IDbContext context)
            {
                _context = context ?? throw new ArgumentNullException(nameof(context));
            }
    
            public int Commit()
            {
                return _context.SaveChanges();
            }
        }

    定义IActionFilter实现类

    如果action执行结束后未发现异常,则提交事务(最终调用DbContext的SaveChanges方法)

    public class GenericBusinessActionFilter : IActionFilter
        {
            private readonly IUnitOfWork _unitOfWork;
    
            public GenericBusinessActionFilter(IUnitOfWork unitOfWork)
            {
                _unitOfWork = unitOfWork;
            }
            public void OnActionExecuting(ActionExecutingContext context)
            {
                // do something before the action executes
            }
            public void OnActionExecuted(ActionExecutedContext context)
            {
                if (context.Exception == null)
                {
                    //uow commit
                    _unitOfWork.Commit();
                }
            }
        }

     注册过滤器

    UOW注入

     

    项目使用了autofac注入框架,未使用任何注入框架的同学可以通过.netcore自带的注入服务services.AddScoped方法实现.

     services.AddScoped<IUnitOfWork, UnitOfWork>();

    最关键的一点,引用圣杰的一句话:

    确保Uow和Reopository之间共享同一个DbContext实例

    这里我们限定了DbContext和UnitOfWork的生命周期为Scoped,从而确保每次请求共用同一个对象。如何理解呢?就是整个调用链上的需要注入的同类型对象,使用是同一个类型实例。

    最后

    本文实现了全局UOW,所有Action不用写任何代码就可以实现事务提交,看完一脸懵逼的同学需要先了解DDD和UOW相关概念

    感谢『圣杰』的文章(http://www.cnblogs.com/sheng-jie/p/7416302.html#autoid-3-0-0)提供思路

    greedy丶L
  • 相关阅读:
    Java中的匿名对象、内部类、包、代码块
    Java中的final和static关键字
    Java中的this与super关键字
    Java中的构造方法
    Java中的多态
    Vue+Element中Table懒加载,新增、删除操作后手动更新
    JQ取消hover事件
    github.com访问慢解决
    vue cli3 子目录问题
    右键事件 contextmenu
  • 原文地址:https://www.cnblogs.com/GreedyL/p/7474368.html
Copyright © 2020-2023  润新知