平时我们使用事务,需要显示的Try Catch 并且开启事务 提交事务 异常回滚事务 三步骤,使用工作单元后则只需要Commit。

1.接口定义

 1     /// <summary>
2 /// 工作单元接口类
3 /// </summary>
4 public interface IUnitOfWork : IDisposable
5 {
6 /// <summary>
7 /// 是否提交
8 /// </summary>
9 bool IsCommit { get; }
10
11 /// <summary>
12 /// 数据库上下文
13 /// </summary>
14 IDbContext Db { get; }
15
16 /// <summary>
17 /// 提交
18 /// </summary>
19 /// <returns></returns>
20 bool Commit();
21 }

2.接口实现

 1 /// <summary>
2 /// 工作单元实现类
3 /// </summary>
4 public class UnitOfWork : IUnitOfWork
5 {
6 /// <summary>
7 /// 释放
8 /// </summary>
9 private bool disposed = false;
10
11 /// <summary>
12 /// 是否提交
13 /// </summary>
14 public bool IsCommit { get; private set; }
15
16 /// <summary>
17 /// 数据库上下文
18 /// </summary>
19 public IDbContext Db { get; }
20
21 /// <summary>
22 /// 构造方法
23 /// </summary>
24 /// <param name="db">数据库上下文</param>
25 public UnitOfWork(IDbContext db)
26 {
27 this.Db = db;
28 this.Db.BeginTranAsync().Wait();
29 }
30
31 /// <summary>
32 /// 提交
33 /// </summary>
34 /// <returns></returns>
35 public bool Commit()
36 {
37 if (!IsCommit)
38 {
39 this.Db.CommitTranAsync().Wait();
40 IsCommit = true;
41 }
42 return IsCommit;
43 }
44
45 /// <summary>
46 /// 释放
47 /// </summary>
48 public void Dispose()
49 {
50 Dispose(true);
51 GC.SuppressFinalize(this);
52 }
53
54 /// <summary>
55 /// 释放
56 /// </summary>
57 /// <param name="disposing">释放标记</param>
58 protected virtual void Dispose(bool disposing)
59 {
60 if (!this.disposed)
61 {
62 if (disposing)
63 {
64 if (!IsCommit)
65 {
66 this.Db.RollbackTranAsync().Wait();
67 }
68 }
69 disposed = true;
70 }
71 }
72
73 /// <summary>
74 /// 析构函数
75 /// </summary>
76 ~UnitOfWork()
77 {
78 Dispose(false);
79 }
80 }

3.使用方式

1.注册服务

1 // Add DbContext Service
2 builder.Services.AddFastDbContext();
3 // Add UnitOfWork Service
4 builder.Services.AddFastUnitOfWork();

2.构造方法注入  UnitOfWork 对象使用时 无需显示using 当发生异常时会自动调用 Dispose 方法

        /// <summary>
/// 构造方法
/// </summary>
/// <param name="logger"></param>
public ValuesController(ILogger<ValuesController> logger,IUnitOfWork unitOfWork)
{
this.logger = logger;
this.unitOfWork = unitOfWork;
} [HttpGet]
public async Task<string> TestUnitOfWork()
{
var result1 = await unitOfWork.Db.Insert(new Category()
{
CategoryName = "类别3"
}).ExceuteAsync(); var result2 = await unitOfWork.Db.Insert(new Product()
{
ProductCode = "测试工作单元_111",
}).ExceuteAsync(); unitOfWork.Commit();
return "工作单元执行完成...";
}

翻译

搜索

复制

最新文章

  1. CSS笔记总结
  2. 最新ecshop v2.7.3版本去版权完全版
  3. 初步了解yield_python
  4. 鸟瞰Nodejs
  5. SQL Server数据库学习总结
  6. C#_在.net中序列化读写xml方法的总结
  7. HDU2571:命运(DP)
  8. vs2005及以上版本的程序分发问题
  9. J2EE开发HelloWorld
  10. Java并发编程(2):线程中断(含代码)
  11. html+css手记
  12. Anaconda使用
  13. linux_文件系统
  14. [BZOJ1031] [JSOI2007] 字符加密Cipher (后缀数组)
  15. Struts 1 之&lt;html&gt;标签库
  16. unit3d 初次接触
  17. N!分解质因子p的个数_快速求组合数C(n,m)
  18. {}+[]与console.log({}+[])结果不同?从JavaScript的大括号谈起
  19. djang-rest-framework学习-day1
  20. drupal7 模糊查询接口

热门文章

  1. PHP全栈开发(七):PHP与MySQL存储交互(1.连接、创建数据库;创建数据表)
  2. sg函数入门理解
  3. SpringBoot-JavaMailSender接口实战
  4. 安装 LAMP 环境(yum 版本) shell脚本
  5. 用copyof来复制数组
  6. 通过 Github Action 实现定时推送天气预报
  7. .Net Core中获取appsettings.json中的节点数据
  8. 如何检查“lateinit”变量是否已初始化?
  9. Linux之Docker-01
  10. springboot如何处理矩阵参数类型的url