自研ORM框架实现工作单元模式

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

1.接口定义

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

2.接口实现

 1 /// 
 2     /// 工作单元实现类
 3     /// 
 4     public class UnitOfWork : IUnitOfWork
 5     {
 6         /// 
 7         /// 释放
 8         /// 
 9         private bool disposed = false;
10 
11         /// 
12         /// 是否提交
13         /// 
14         public bool IsCommit { get; private set; }
15 
16         /// 
17         /// 数据库上下文
18         /// 
19         public IDbContext Db { get; }
20 
21         /// 
22         /// 构造方法
23         /// 
24         /// 数据库上下文
25         public UnitOfWork(IDbContext db)
26         {
27             this.Db = db;
28             this.Db.BeginTranAsync().Wait();
29         }
30 
31         /// 
32         /// 提交
33         /// 
34         /// 
35         public bool Commit()
36         {
37             if (!IsCommit)
38             {
39                 this.Db.CommitTranAsync().Wait();
40                 IsCommit = true;
41             }
42             return IsCommit;
43         }
44 
45         /// 
46         /// 释放
47         /// 
48         public void Dispose()
49         {
50             Dispose(true);
51             GC.SuppressFinalize(this);
52         }
53 
54         /// 
55         /// 释放
56         /// 
57         /// 释放标记
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         /// 
74         /// 析构函数
75         /// 
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 方法

        /// 
        /// 构造方法
        /// 
        /// 
        public ValuesController(ILogger logger,IUnitOfWork unitOfWork)
        {
            this.logger = logger;
            this.unitOfWork = unitOfWork;
        }

        [HttpGet]
        public async Taskstring> 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 "工作单元执行完成...";
        }

 

 

文章来源于互联网:自研ORM框架实现工作单元模式

THE END
分享
二维码