之前在我的文章中,通过实例展示Asp.Net Core 2.0 之旅---AutoFac 仓储泛型的依赖注入,并在结尾处提到了事务的统一管理。

仓储的概念是DDD领域的一部分,仓储封装了获取数据的逻辑,领域对象无需和底层数据库打交道。但是从之前的仓储实现中,每个增删改查都显示的调用了SaveChanges方法,导致每次更改都提交事务。如果我们操作多个仓储对象时,就无法批量提交,无法实现Unit Of Work模式了(UOW模式是,通过事务,一次性提交所以的更改,保证了数据的完整性),要实现UOW,接下来就要对仓储实现的方法就行调整了。

1、定义IUnitOfWork接口,定义两个方法,SaveChanges 同步方法,SaveChangesAsync 异步方法

 public interface IUnitOfWork{/// <summary>/// 提交更改/// </summary>/// <returns></returns>int SaveChanges();/// <summary>/// 提交更改异步/// </summary>/// <returns></returns>Task<int> SaveChangesAsync();/// <summary>/// 开启事务/// </summary>void BeginTransaction();/// <summary>/// 提交事务/// </summary>void CommitTransaction();/// <summary>/// 回滚事务/// </summary>void RollBackTransaction();}

2、定义 IUnitOfWork的实现类UnitOfWork,定义泛型TDBContext其类型必须是DbContext,通过构造函数依赖注入_dbContext

  public class UnitOfWork<TDBContext> : IUnitOfWork where TDBContext : DbContext{private readonly TDBContext _dbContext;public UnitOfWork(TDBContext dbContext){_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));}public int SaveChanges(){return _dbContext.SaveChanges();}public async Task<int> SaveChangesAsync(){return await _dbContext.SaveChangesAsync();}public void BeginTransaction(){_dbContext.Database.BeginTransaction();}public void CommitTransaction(){_dbContext.Database.CommitTransaction();}public void RollBackTransaction(){_dbContext.Database.RollbackTransaction();}}

3、修改仓储的实现类,其实现类的链接在文章顶部已经实现了,但是要把 this._context.SaveChanges();这行代码全部删除。这样就不会每次更改就会提交,而是交由IUnitOfWork 统一的提交事务。

4、注册IUnitOfWork的时候要注意,要确保 UnitOfWork和DBContext 在整个请求中共用同一个对象,这样才能通过IUnitOfWork 来一次性提交事务。AddDbContext这个方法它默认的生命周期为ServiceLifetime.Scoped,所以只需要注册IUnitOfWork的时候使用AddScoped方法,将其生命周期限定为Scoped,就能保证每次请求都是共用同一个对象。

            services.AddDbContext<YunSourseContext>(option => option.UseSqlServer(Configuration.GetConnectionString("Default"), b => b.UseRowNumberForPaging()));//配置sqlserverservices.AddScoped<IUnitOfWork,UnitOfWork<YunSourseContext>>();//注入UOW依赖,确保每次请求都是同一个对象

5、代码改造完毕,接下来就要就行实例演示了

1)通过构造函数依赖注入 _userIRepository 和 _unitOfWork ,将事务统一交由 _unitOfWork 来管理

        private readonly IRepository<User> _userIRepository;private readonly IUnitOfWork _unitOfWork;public UserManager(IRepository<User> userIRepository,IUnitOfWork unitOfWork){_userIRepository = userIRepository;_unitOfWork = unitOfWork;

2)连续插入两个实体:没有执行_unitOfWork.SaveChanges()之前,数据库中没有新增的数据,只有执行了_unitOfWork.SaveChanges(),数据库才新增了两条数据,说明只提交了一次更改,符合预期目的。

 var user = new User()  {  UserName = "1",  UserPwd = "12",  CreationTime = DateTime.Now,  };
var user1 = new User()  {  UserName = "11",  UserPwd = "121",  CreationTime = DateTime.Now,  };  await _userIRepository.InsertAsync(user);  await _userIRepository.InsertAsync(user1);  _unitOfWork.SaveChanges();  

3)进行事务操作:如下所示,InsertAndGetId这个方法,会将实体提交到数据库,并返回实体的主键Id,如果后面执行的过程中发生了异常,就需要回滚数据。用于数据的强一致性应用场景。

  var user = new User(){UserName = "1111",UserPwd = "12",CreationTime = DateTime.Now,};var user1 = new User(){UserName = "11",UserPwd = "121",CreationTime = DateTime.Now,};try{_unitOfWork.BeginTransaction();//开启事务var userId = _userIRepository.InsertAndGetId(user);//获取UserId,此时已经提交到数据库await _userIRepository.InsertAsync(user1);await _unitOfWork.SaveChangesAsync();//提交变更_unitOfWork.CommitTransaction();//提交事务}catch{_unitOfWork.RollBackTransaction();//回滚事务throw;}

Asp.Net Core 2.0 之旅---数据访问仓储模式的事务管理相关推荐

  1. [译]ASP.NET Core 2.0 机密配置项

    问题 如何在ASP.NET Core 2.0中保存机密配置项(不用将其暴露给源代码管理器)? 答案 创建一个ASP.NET Core 2.0空项目,在项目节点上点击右键,并点击菜单项 - 管理用户机密 ...

  2. .NET Core amp; ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  3. [译]ASP.NET Core 2.0 部分视图

    问题 如何在ASP.NET Core 2.0中使用部分视图来重用页面的公共部分? 答案 新建一个空项目,在Startup中添加MVC服务和中间件: public void ConfigureServi ...

  4. .NET Core ASP.NET Core 1.0在Redhat峰会上正式发布

    众所周知,Red Hat和微软正在努力使.NET Core成为Red Hat企业版Linux (RHEL)系统上的一流开发平台选项.这个团队已经一起工作好几个月了,RHEL对.NET有许多需求.今天在 ...

  5. diskgeniusv4.4.0_.NET Core 3.0及ASP.NET Core 3.0前瞻

    (给DotNet加星标,提升.Net技能) 转自:LineZerocnblogs.com/linezero/p/netcore3 前几天微软发布了< .NET Core 3.0 Preview ...

  6. ASP.NET Core 2.0 使用支付宝PC网站支付

    概述 支付宝有比较多的支付产品,比如当面付.APP支付.手机网站支付.电脑网站支付等,本次讲的是电脑网站支付. 详细 代码下载:http://www.demodashi.com/demo/11730. ...

  7. 从头编写 asp.net core 2.0 web api 基础框架 (4) EF配置

    第一部分: https://www.cnblogs.com/frank0812/p/11165940.html 第二部分:https://www.cnblogs.com/frank0812/p/111 ...

  8. 【转载】从头编写 asp.net core 2.0 web api 基础框架 (1)

    工具: 1.Visual Studio 2017 V15.3.5+ 2.Postman (Chrome的App) 3.Chrome (最好是) 关于.net core或者.net core 2.0的相 ...

  9. ASP.NET Core 3.0中使用动态控制器路由

    原文:Dynamic controller routing in ASP.NET Core 3.0 作者:Filip W 译文:https://www.cnblogs.com/lwqlun/p/114 ...

最新文章

  1. php多进程共享数据库,PHP多进程环境下通过共享内存与信号量实现资源共享
  2. python猜数游戏流程_python简单猜数游戏实例
  3. 【转】你必须了解的Session的本质
  4. 电脑不能访问服务器指定端口6,windows server2008 无法访问本机及其他服务器的所有端口...
  5. 当“天天酷跑”遇上“Python程序员” 另类演绎团战新玩法(学到了学到了~)
  6. 计算机网络面试题整理
  7. 交流继电器rc吸收电路_使用固态继电器的注意事项
  8. NPOI 教程 - 3.2 打印相关设置
  9. 构建 Netflix 分布式追踪(tracing)体系
  10. vb6 英文和中文长度不同_PPT里中文排版就是没英文好看?你怕是假酒喝多了…...
  11. allegro设置规则
  12. 教案设计计算机,计算机应用基础教案设计
  13. fewX(fsod)的预测代码编写--detectron2框架的一般见解(1)
  14. Python爬虫之爬取实习僧并导入Mysql
  15. 一年后再回头看系列之C/C++中的选择法排序、冒泡排序
  16. 【微信公众号H5授权登录】
  17. python中open()函数里中文处理
  18. 电子和计算机工程密歇根大学,美国密歇根大学迪尔本校区电子与计算机工程系主任 Yi Lu Murphey教授来我校进行学术交流并作学术报告...
  19. OpenGL 2D贴图texture与着色器Shader
  20. QML_组合框ComboBox

热门文章

  1. 威马汽车欲曲线上市:沈晖已提前持股并任职,销量垫底、员工降薪
  2. 正则化为什么可以防止过拟合
  3. 【Java闭关修炼】SpringBoot项目-贪吃蛇对战小游戏-配置Mysql与注册登录模块2
  4. 荣耀平板 8 新款 8GB+256GB 版本 评测
  5. 《Android群英传》---读书笔记6
  6. haskell php,Haskell简介
  7. 计算机考研大三上准备什么,2020计算机考研:前期复习有三大事项要注意!
  8. 前端——css相对定位,绝对定位,固定定位
  9. 写一个荒野求生的代码
  10. 除了量子计算机还有什么,被西方称为中国新“霸权”的量子计算机,除了波色采样还会什么?...