zoukankan      html  css  js  c++  java
  • .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

  • 相关阅读:
    单词统计-续
    “帮你APP”团队冲刺10
    软件工程周总结15
    梦断代码阅读笔记03
    个人课程总结
    梦断代码阅读笔记02
    梦断代码阅读笔记01
    软件工程周总结14
    计算最长英语单词链
    软件工程周总结13
  • 原文地址:https://www.cnblogs.com/letnet/p/12100992.html
Copyright © 2011-2022 走看看