.NetCore學習筆記:一、UnitOfWork工作單元


Maintains a list of objects affected by a business transaction and coordinates the writing out of changes and the resolution of concurrency problems.

  Unit of Work --Martin Fowler

Unit Of Work模式,由馬丁大叔提出,是一種數據訪問模式。UOW模式的作用是在業務用例的操作中跟蹤對象的所有更改(增加、刪除和更新),並將所有更改的對象保存在其維護的列表中。在業務用例的終點,通過事務,一次性提交所有更改,以確保數據的完整性和有效性。總而言之,UOW協調這些對象的持久化及並發問題。

定義工作單元接口:

 1 /// <summary>
 2 /// 工作單元接口
 3 /// </summary>
 4 public interface IUnitOfWork : IDisposable
 5 {
 6     /// <summary>
 7     /// 事務
 8     /// </summary>
 9     IDbTransaction DbTransaction { get; }
10     /// <summary>
11     /// 數據連接
12     /// </summary>
13     IDbConnection DbConnection { get; }
14 
15     /// <summary>
16     /// 開啟事務
17     /// </summary>
18     void BeginTransaction();
19     /// <summary>
20     /// 完成事務
21     /// </summary>
22     void Commit();
23     /// <summary>
24     /// 回滾事務
25     /// </summary>
26     void Rollback();
27 }

實現工作單元:

 1 /// <summary>
 2 /// 工作單元
 3 /// </summary>
 4 public class UnitOfWork : IUnitOfWork
 5 {
 6     private bool _disposed;
 7     private IDbTransaction _trans = null;
 8     /// <summary>
 9     /// 事務
10     /// </summary>
11     public IDbTransaction DbTransaction { get { return _trans; } }
12 
13     private IDbConnection _connection;
14     /// <summary>
15     /// 數據連接
16     /// </summary>
17     public IDbConnection DbConnection { get { return _connection; } }
18 
19     public UnitOfWork(IConfiguration configuration)
20     {
21         var connectionString = configuration.GetConnectionString("SqlConnection");
22         _connection = new MySqlConnection(connectionString); //這里使用的mysql 23         _connection.Open();
24     }
25 
26     /// <summary>
27     /// 開啟事務
28     /// </summary>
29     public void BeginTransaction()
30     {
31         _trans = _connection.BeginTransaction();
32     }
33     /// <summary>
34     /// 完成事務
35     /// </summary>
36     public void Commit() => _trans?.Commit();
37     /// <summary>
38     /// 回滾事務
39     /// </summary>
40     public void Rollback() => _trans?.Rollback();
41 
42     public void Dispose()
43     {
44         Dispose(true);
45         GC.SuppressFinalize(this);
46     }
47 
48     ~UnitOfWork() => Dispose(false);
49 
50     protected virtual void Dispose(bool disposing)
51     {
52         if (_disposed)
53             return;
54         if (disposing)
55         {
56             _trans?.Dispose();
57             _connection?.Dispose();
58         }
59         _trans = null;
60         _connection = null;
61         _disposed = true;
62     }
63 }

在IServiceCollection容器中注冊:

services.AddScoped<IUnitOfWork, UnitOfWork>();

 

源碼地址:https://github.com/letnet/NetCoreDemo


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM