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容器中注册:

  1. services.AddScoped<IUnitOfWork, UnitOfWork>();

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

.NetCore学习笔记:一、UnitOfWork工作单元的更多相关文章

  1. .NetCore学习笔记:三、基于AspectCore的AOP事务管理

    AOP(面向切面编程),通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术.AOP是OOP的延续,是函数式编程的一种衍生范型.利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑 ...

  2. HTML&CSS基础学习笔记1.15-合并单元格

    合并单元格 之前的文章中,我们已经能够创建一个简单地表格了,如果我们需要把横向的某两个相邻单元格<td>或者纵向的某两个相邻单元格<td>合并,我们该怎么做呢?我们要知道的知识 ...

  3. linux学习笔记:第三单元 Linux命令及获取帮助

    第三单元 Linux命令及获取帮助 11) 了解Linux命令的语法格式:命令 [选项] [参数]2) 掌握命令格式中命令.选项.参数的具体含义a) 命令:告诉Linux(UNIX)操作系统做(执行) ...

  4. Excel开发学习笔记:根据工作表worksheet内容控制按钮的状态

    开发环境基于VSTO,具体配置:visual studio 2010,VB .Net,excel 2007,文档级别的定制程序. 在Ribbon工具栏中有2个功能按钮,它们是否可用取决于workshe ...

  5. MFC学习笔记1---准备工作

    什么是MFC MFC,全称Microsoft Foundation Classes,微软基础类库,顾名思义,是微软的攻城狮们将一些常用的基础的Windows API 函数用C++的形式封装成类,简化程 ...

  6. Android学习笔记View的工作原理

    自定义View,也可以称为自定义控件,通过自定义View可以使得控件实现各种定制的效果. 实现自定义View,需要掌握View的底层工作原理,比如View的测量过程.布局流程以及绘制流程,除此之外,还 ...

  7. 创建第一个core项目(netCore学习笔记1)

    1.安装 core和netFramework其实是相对独立的,但是core的IDE是在vs2017才开始支持,而vs2017的安装环境必须搭配.net4.6,所以: Step1:安装.net4.6 S ...

  8. 学习笔记之Struts2—工作原理图

    本文以Struts2的官方工作原理图作为主线讲解(参考部分书籍与视频) 1.初始概念 struts2是web.xml进行配置的一个过滤器,当web项目启动的时候,这个过滤器就会生效. 2.web.xm ...

  9. .NetCore学习笔记:二、基于Dapper的泛型Repository

    为减少代码量,这里实现一个基于Dapper的泛型Repository. 这里需要引用Dapper.dll和Dapper.Contrib.dll. 接口定义: /// <summary> / ...

随机推荐

  1. IIS停止服务 报错Connections_Refused

    IIS版本6.0  无故停止工作.         重启IIS 没有效果,必须重启web服务器.出现客户端无法访问Web服务器上的站点,错误信息提示为"页面无法显示"的情况.登录服 ...

  2. firewall-cmd命令

    firewalld 基本操作 安装firewalld # yum install firewalld firewall-config firewalld启动,停止,开机启动与否,查看状态 # syst ...

  3. Rip 动态路由协议

            路由信息协议(RIP) 是内部网关协议IGP中最先得到广泛使用的协议.        Routing Information Protocol) RIP是一种分布式的基于距离矢量的路由 ...

  4. 1336 - Sigma Functio

    1336 - Sigma Function Sigma function is an interesting function in Number Theory. It is denoted by t ...

  5. HTML页面缓存

    引出问题: 在做完一个项目迭代上线的时候遇到一个问题:Ht代码部署在nginx里面,当我打包的H5代码上传把之前代码替换掉之后,如果手机端之前有打开过相关的页面,那么在代码上传成功后再次打开,回出现一 ...

  6. ClientAbortException :客户端异常终止

    ClientAbortException :客户端异常终止 java.io.IOException: 你的主机中的软件中止了一个已建立的连接. 罪魁祸首: <img src="chec ...

  7. html语义化的意义

    易于用户阅读,样式丢失的时候能让页面呈现清晰的结构. 有利于SEO,搜索引擎根据标签来确定上下文和各个关键字的权重. 方便其他设备解析,如盲人阅读器根据语义渲染网页 有利于开发和维护,语义化更具可读性 ...

  8. C#个推SDK推送安卓+iOS

    下载个推SDK,找到这两个dll直接引用. using引用 using com.gexin.rp.sdk.dto; using com.igetui.api.openservice; using co ...

  9. ubuntu18.04管理redis

    ubuntu下 redis的安装使用 安装 1. 进入redis安装路径 cd ~/installed/redis-5.0.7 2. 启动redis 启动服务端redis-server 启动客户端(必 ...

  10. SpringBoot支持SpringData es

    ElasticSearch CRUD 1.springboot springData es spring data 是spring对数据访问抽象.这些数据可以放入db,index,nosql等包含以下 ...