.NetCore學習筆記:1、UnitOfWork工做單元

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

  Unit of Work --Martin Fowlersql

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

定義工做單元接口:this

 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 }

實現工做單元:spa

 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容器中註冊:code

services.AddScoped<IUnitOfWork, UnitOfWork>();
相關文章
相關標籤/搜索