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>();