.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)提供思路
转载于:https://www.cnblogs.com/GreedyL/p/7474368.html
.Net Core2.0基于DbContext,IActionFilter过滤器实现全局UOW,不使用TransactionScope相关推荐
- Asp.Net Core2.0 基于QuartzNet任务管理系统
Quartz.NET官网地址:https://www.quartz-scheduler.net/ Quartz.NET文档地址:https://www.quartz-scheduler.net/doc ...
- 浅析Entity Framework Core2.0的日志记录与动态查询条件
前言 Entity Framework Core 2.0更新也已经有一段时间了,园子里也有不少的文章.. 本文主要是浅析一下Entity Framework Core2.0的日志记录与动态查询条件 去 ...
- net core体系-web应用程序-4asp.net core2.0 项目实战(1)-10项目各种全局帮助类
本文目录 1. 前沿 2.CacheHelper基于Microsoft.Extensions.Caching.Memory封装 3.XmlHelper快速操作xml文档 4.Serializatio ...
- Slickflow.NET 开源工作流引擎基础介绍-.NET Core2.0 版本实现介绍
前言:.NET Core 是.NET Framework的新一代版本,是微软开发的第一个跨平台 (Windows.Mac OSX.Linux) 的应用程序开发框架(Application Framew ...
- Asp.NET Core2.0 项目实战入门视频课程_完整版
END OR START? 看到这个标题,你开不开心,激不激动呢? 没错,.net core的入门课程已经完毕了.52ABP.School项目从11月19日,第一章视频的试录制,到今天完整版出炉,离不 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之八 || API项目整体搭建 6.3 异步泛型仓储+依赖注入初探...
代码已上传Github+Gitee,文末有地址 番外:在上文中,也是遇到了大家见仁见智的评论和反对,嗯~说实话,积极性稍微受到了一丢丢的打击,不过还好,还是有很多很多很多人的赞同的,所以会一直坚持下去 ...
- 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之十一 || AOP自定义筛选,Redis入门 11.1...
大神留步 先说下一个窝心的问题,求大神帮忙,如何在Task异步编程中,使用Redis存.取Task<List<T>>泛型,有偿帮助,这里谢谢,文末有详细问题说明,可以留言或者私 ...
- Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版
2019独角兽企业重金招聘Python工程师标准>>> 摘要: Spring3.2.0-mybatis3.2.0 基于全注解搭建的后台框架-基础版 没有什么不可能 之前一直用的是自 ...
- Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境
一.简介 一直以来,微软只对自家平台提供.NET支持,这样等于让这个"理论上"可以跨平台的框架在Linux和macOS上的支持只能由第三方项目提供(比如Mono .NET).直到微 ...
最新文章
- iota和左移右移的用法
- linux .net core java_仅在.NET Core 2.0运行时的Linux上缺少运行时存储库错误
- 异步socket优雅的关闭-CancelIO和SO_LINGER
- java8方法引用符合_Java8 方法引用和构造方法引用
- Linux机器件拷贝文件
- centos下php5.4.22连接mssql,IIS7.5配置php5.4.22链接sql2008(用PDO链接数据库)_PHP教程...
- 在Windows 2003 IIS 6.0中配置PHP的运行环境(图)
- 【嵌入式Linux】嵌入式Linux应用开发基础知识之网络通信
- 【题解】Luogu P5071 [Ynoi2015]此时此刻的光辉
- 我的WCF4 Rest Service及Entity Framework with POCO之旅(三)——用Entity Framework和POCO Template实现数据模型及存储...
- 为什么磁盘慢会导致Linux负载飙升?
- [20180625]10g下查询条件rownum = 0.txt
- 从菜鸟到资深工程师的进阶之路-任玉刚专访
- 工业互联网是什么?发展有多厉害?
- SIM卡无法识别经验案例
- 转载精品:工作8年的普通专科生程序员的一些感悟
- qq截图快捷键,小编教你qq截图快捷键怎么设置
- Mac电脑没有声音但是重启后恢复
- 渗透测试常用文件传输方法-Windows篇(如何向Windows服务器中上传文件?) (゚益゚メ) 渗透测试
- Kindle电子书整理脚本
热门文章
- Winform窗体防抖动
- 耗时统计利器——StopWatch秒表
- Spring 核心技术与产品理念剖析【下】
- 【网络】流量监控 - iftop|ifstat|查看某个ip流量|tcpdump|iptraf|Linux
- 小米10获取root权限_红米Note8Pro 怎么获取ROOT权限-Magisk授权-安装Exposed
- WEBPLAYER9电影资源站小偷程序由 宋飞飞发布
- lnmp一键安装包不能允许php文件,lnmp一键安装包常见问题解决方法
- 解扰matlab,数据序列的扰乱与解扰的MATLAB实现及性能分析——利用19级m序列
- 物流业如何借力物联网
- java笔试题String字符串单词逆序how are you变成are you how