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协调这些对象的持久化及并发问题。

定义工作单元接口:

 /// <summary>
/// 工作单元接口
/// </summary>
public interface IUnitOfWork : IDisposable
{
/// <summary>
/// 事务
/// </summary>
IDbTransaction DbTransaction { get; }
/// <summary>
/// 数据连接
/// </summary>
IDbConnection DbConnection { get; } /// <summary>
/// 开启事务
/// </summary>
void BeginTransaction();
/// <summary>
/// 完成事务
/// </summary>
void Commit();
/// <summary>
/// 回滚事务
/// </summary>
void Rollback();
}

实现工作单元:

 /// <summary>
/// 工作单元
/// </summary>
public class UnitOfWork : IUnitOfWork
{
private bool _disposed;
private IDbTransaction _trans = null;
/// <summary>
/// 事务
/// </summary>
public IDbTransaction DbTransaction { get { return _trans; } } private IDbConnection _connection;
/// <summary>
/// 数据连接
/// </summary>
public IDbConnection DbConnection { get { return _connection; } } public UnitOfWork(IConfiguration configuration)
{
var connectionString = configuration.GetConnectionString("SqlConnection");
_connection = new MySqlConnection(connectionString); //这里使用的mysql
_connection.Open();
} /// <summary>
/// 开启事务
/// </summary>
public void BeginTransaction()
{
_trans = _connection.BeginTransaction();
}
/// <summary>
/// 完成事务
/// </summary>
public void Commit() => _trans?.Commit();
/// <summary>
/// 回滚事务
/// </summary>
public void Rollback() => _trans?.Rollback(); public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
} ~UnitOfWork() => Dispose(false); protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
_trans?.Dispose();
_connection?.Dispose();
}
_trans = null;
_connection = null;
_disposed = true;
}
}

在IServiceCollection容器中注册:

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. 使用ASDM 管理 ciscoASA设备

    用vm虚拟机模拟了一台 ASA设备   自适应安全设备软件为 ASA8.25  asdm镜像为asdm-6.49.bin 用客户端连接时,一定要安装java  jre,版本我是用的是7,6应该也可以. ...

  2. [CentOS7 mini]Linux命令补全 yum install bash-completion

    CentOS7 mini默认不带命令补全需要自行安装 使用国内yum清华源 安装完后退出当前窗口再登录生效 # yum install -y bash-completion 已加载插件:fastest ...

  3. 【GET TIPS】Chrome所见即所得的截图技巧

    精简的前言: 对,我就是想说下事情的来龙去脉.您要不想听,就把耳朵捂起来23333. 想截个新冠肺炎病毒,全国确诊人数今日增长的图,以确定非湖北地区不再明显增长. 但由于网页需要的内容分布在两页,需要 ...

  4. Idea操作ElasticSearch

    前提: 1.ES服务成功启动 2.node.js成功启动 一.创建索引库 1.目录展示 2.导入依赖 <dependency> <groupId>org.elasticsear ...

  5. EF--封装三层架构IOC

    为什么分层? 不分层封装的话,下面的代码就是上端直接依赖于下端,也就是UI层直接依赖于数据访问层,分层一定要依赖抽象,满足依赖倒置原则,所以我们要封装,要分层 下面这张图和传统的三层略有不同,不同之处 ...

  6. idea创建基于maven的web项目

    1.点击create new project,选择maven,点击next 2.输入项目信息,点击finish 3.进入项目后,点击菜单File->Project Structure开始配置项目 ...

  7. js中如果遇到低版本安卓设备调用setTimeout不生效解决办法

    工作中会遇到低版本安卓设备调用setTimeout不生效,既不会报错,里面的函数也不会执行,这里po一个解决办法,如果不执行则执行安卓自己封装的原生的setTimeout方法:sdk.setTimeo ...

  8. 10.Android-SharedPreferences使用

    1.SharedPreferences介绍 SharedPreferences,它是一个轻量级的配置文件类,用于保存软件配置参数. 采用xml文件形式存储在/data/data/包名/shared_p ...

  9. 2020数据字典php-直接复制

    [2020数据字典php-直接复制] <?php /** * 生成mysql数据字典 */ header ( "Content-type: text/html; charset=utf ...

  10. k8s强制删除pod

    有时候pod一直在Terminating kubectl delete pod xxx --force --grace-period=