.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

posted @ 2019-12-26 11:20  爱听民谣的程序猿  阅读(3498)  评论(4编辑  收藏  举报