平时我们使用事务,需要显示的Try Catch 并且开启事务 提交事务 异常回滚事务 三步骤,使用工作单元后则只需要Commit。

1.接口定义

 1     /// <summary>
2 /// 工作单元接口类
3 /// </summary>
4 public interface IUnitOfWork : IDisposable
5 {
6 /// <summary>
7 /// 是否提交
8 /// </summary>
9 bool IsCommit { get; }
10
11 /// <summary>
12 /// 数据库上下文
13 /// </summary>
14 IDbContext Db { get; }
15
16 /// <summary>
17 /// 提交
18 /// </summary>
19 /// <returns></returns>
20 bool Commit();
21 }

2.接口实现

 1 /// <summary>
2 /// 工作单元实现类
3 /// </summary>
4 public class UnitOfWork : IUnitOfWork
5 {
6 /// <summary>
7 /// 释放
8 /// </summary>
9 private bool disposed = false;
10
11 /// <summary>
12 /// 是否提交
13 /// </summary>
14 public bool IsCommit { get; private set; }
15
16 /// <summary>
17 /// 数据库上下文
18 /// </summary>
19 public IDbContext Db { get; }
20
21 /// <summary>
22 /// 构造方法
23 /// </summary>
24 /// <param name="db">数据库上下文</param>
25 public UnitOfWork(IDbContext db)
26 {
27 this.Db = db;
28 this.Db.BeginTranAsync().Wait();
29 }
30
31 /// <summary>
32 /// 提交
33 /// </summary>
34 /// <returns></returns>
35 public bool Commit()
36 {
37 if (!IsCommit)
38 {
39 this.Db.CommitTranAsync().Wait();
40 IsCommit = true;
41 }
42 return IsCommit;
43 }
44
45 /// <summary>
46 /// 释放
47 /// </summary>
48 public void Dispose()
49 {
50 Dispose(true);
51 GC.SuppressFinalize(this);
52 }
53
54 /// <summary>
55 /// 释放
56 /// </summary>
57 /// <param name="disposing">释放标记</param>
58 protected virtual void Dispose(bool disposing)
59 {
60 if (!this.disposed)
61 {
62 if (disposing)
63 {
64 if (!IsCommit)
65 {
66 this.Db.RollbackTranAsync().Wait();
67 }
68 }
69 disposed = true;
70 }
71 }
72
73 /// <summary>
74 /// 析构函数
75 /// </summary>
76 ~UnitOfWork()
77 {
78 Dispose(false);
79 }
80 }

3.使用方式

1.注册服务

1 // Add DbContext Service
2 builder.Services.AddFastDbContext();
3 // Add UnitOfWork Service
4 builder.Services.AddFastUnitOfWork();

2.构造方法注入  UnitOfWork 对象使用时 无需显示using 当发生异常时会自动调用 Dispose 方法

        /// <summary>
/// 构造方法
/// </summary>
/// <param name="logger"></param>
public ValuesController(ILogger<ValuesController> logger,IUnitOfWork unitOfWork)
{
this.logger = logger;
this.unitOfWork = unitOfWork;
} [HttpGet]
public async Task<string> TestUnitOfWork()
{
var result1 = await unitOfWork.Db.Insert(new Category()
{
CategoryName = "类别3"
}).ExceuteAsync(); var result2 = await unitOfWork.Db.Insert(new Product()
{
ProductCode = "测试工作单元_111",
}).ExceuteAsync(); unitOfWork.Commit();
return "工作单元执行完成...";
}

翻译

搜索

复制

自研ORM框架实现工作单元模式的更多相关文章

  1. .NET应用架构设计—工作单元模式(摆脱过程式代码的重要思想,代替DDD实现轻量级业务)

    阅读目录: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单示例 4.总结 1.背景介绍 一直都在谈论面向对象开发,但是开发企业应用系统时,使用面向对象开发最大的问题就是在于,多个对象之 ...

  2. MVC+EF 理解和实现仓储模式和工作单元模式

    MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...

  3. 关于工作单元模式——工作单元模式与EF结合的使用

    工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个Db ...

  4. [.NET领域驱动设计实战系列]专题四:前期准备之工作单元模式(Unit Of Work)

    一.前言 在前一专题中介绍了规约模式的实现,然后在仓储实现中,经常会涉及工作单元模式的实现.然而,在我的网上书店案例中也将引入工作单元模式,所以本专题将详细介绍下该模式,为后面案例的实现做一个铺垫. ...

  5. 仓储(Repository)和工作单元模式(UnitOfWork)

    仓储和工作单元模式 仓储模式 为什么要用仓储模式 通常不建议在业务逻辑层直接访问数据库.因为这样可能会导致如下结果: 重复的代码 编程错误的可能性更高 业务数据的弱类型 更难集中处理数据,比如缓存 无 ...

  6. [.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现

    一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了 ...

  7. Contoso 大学 - 9 - 实现仓储和工作单元模式

    原文 Contoso 大学 - 9 - 实现仓储和工作单元模式 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Micros ...

  8. 演练5-8:Contoso大学校园管理系统(实现存储池和工作单元模式)

    在上一次的教程中,你已经使用继承来消除在 Student 和 Instructor 实体之间的重复代码.在这个教程中,你将要看到使用存储池和工作单元模式进行增.删.改.查的一些方法.像前面的教程一样, ...

  9. 重新整理 .net core 实践篇—————工作单元模式[二十六]

    前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...

  10. 工作单元模式(UnitOfWork)学习总结

    工作单元的目标是维护变化的对象列表.使用IUnitOfWorkRepository负责对象的持久化,使用IUnitOfWork收集变化的对象,并将变化的对象放到各自的增删改列表中, 最后Commit, ...

随机推荐

  1. ASP.NET Core 中的模型绑定

    微软官方文档:ASP.NET Core 中的模型绑定 Route 是通过MVC Route URL取值. 如:http://localhost:5000/Home/Index/2,id取出的值就会是2 ...

  2. 使用开源计算引擎提升Excel格式文件处理效率

    对Excel进行解析\生成\查询\计算等处理是Java下较常见的任务,但Excel的文件格式很复杂,自行编码读写太困难,有了POI\EasyExcel\JExcel等类库就方便多了,其中POI最为出色 ...

  3. PHP微信支付功能

    百度网盘:http://pan.baidu.com/s/1sl5GeVr  l5ud 先下载一份sdk ,引入到自己的项目中,我用的是TP5,配置好namespace 然后在项目中引入: 之后,在去配 ...

  4. Vscode设置标签页多行显示

    1.设置标签页多行展示的方法 文件–>首选项–>设置 2.勾选多行显示按钮 3.显示效果

  5. .net core-利用PdfSharpCore和SkiaSharp.QrCode 添加PDF二维码页眉

    前序 由于去年的一个项目需要在PDF 添加公司二维码 ,当时在网上找了很多操作PDF方案,第一种Aspose.PDF,很遗憾 Aspose.PDF 有添加版权的背景还是页脚我忘记了,不适合公司项目,最 ...

  6. python爬虫下载小说

    1. from urllib.request import urlopen from urllib import request from bs4 import BeautifulSoup from ...

  7. python django搭建一个简易博客的解析(按照文件顺序逐一讲解)

    上次讲解了一下各py文件的内容,但比较乱,所以这次整理了一个顺序版. 源代码请在http://github/Cheng0829/mysite自行下载 mysite: db.sqlite3:数据库文件. ...

  8. python实现多接口翻译软件

    本实验用pyqt5做了一个小软件,里面使用了市面上主流的6种翻译软件接口:谷歌.百度.有道.金山词霸.腾讯.必应,界面如图所示: 以下是程序代码: import time,sys,os,hashlib ...

  9. 0基础90分钟会用PS——GenJi笔记

    数码图像的相关基础概念 1.位图和矢量图 位图 也叫点阵图像,位图使用也称像素的一格一格的小点来描述图像,图放大后我们可以看到像素点 矢量图 根据几何特性来绘制图形,用线段和曲线描述图像,可以是一个一 ...

  10. rocky8删除/etc/fstab 和/boot/所有文件,通过光盘救援模式恢复

    rocky8删除/etc/fstab 和/boot/所有文件,通过光盘救援模式恢复 mkdir /rootdir 先通过df和lsblk确定那个分区是根,如果确定不了,就先挂载一个分区,查看里边的文件 ...