自研ORM框架实现工作单元模式
平时我们使用事务,需要显示的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框架实现工作单元模式的更多相关文章
- .NET应用架构设计—工作单元模式(摆脱过程式代码的重要思想,代替DDD实现轻量级业务)
阅读目录: 1.背景介绍 2.过程式代码的真正困境 3.工作单元模式的简单示例 4.总结 1.背景介绍 一直都在谈论面向对象开发,但是开发企业应用系统时,使用面向对象开发最大的问题就是在于,多个对象之 ...
- MVC+EF 理解和实现仓储模式和工作单元模式
MVC+EF 理解和实现仓储模式和工作单元模式 原文:Understanding Repository and Unit of Work Pattern and Implementing Generi ...
- 关于工作单元模式——工作单元模式与EF结合的使用
工作单元模式往往和仓储模式一起使用,本篇文章讲到的是工作单元模式和仓储模式一起用来在ef外面包一层,其实EF本身就是工作单元模式和仓储模式使用的经典例子,其中DbContext就是工作单元,而每个Db ...
- [.NET领域驱动设计实战系列]专题四:前期准备之工作单元模式(Unit Of Work)
一.前言 在前一专题中介绍了规约模式的实现,然后在仓储实现中,经常会涉及工作单元模式的实现.然而,在我的网上书店案例中也将引入工作单元模式,所以本专题将详细介绍下该模式,为后面案例的实现做一个铺垫. ...
- 仓储(Repository)和工作单元模式(UnitOfWork)
仓储和工作单元模式 仓储模式 为什么要用仓储模式 通常不建议在业务逻辑层直接访问数据库.因为这样可能会导致如下结果: 重复的代码 编程错误的可能性更高 业务数据的弱类型 更难集中处理数据,比如缓存 无 ...
- [.NET领域驱动设计实战系列]专题五:网上书店规约模式、工作单元模式的引入以及购物车的实现
一.前言 在前面2篇博文中,我分别介绍了规约模式和工作单元模式,有了前面2篇博文的铺垫之后,下面就具体看看如何把这两种模式引入到之前的网上书店案例里. 二.规约模式的引入 在第三专题我们已经详细介绍了 ...
- Contoso 大学 - 9 - 实现仓储和工作单元模式
原文 Contoso 大学 - 9 - 实现仓储和工作单元模式 By Tom Dykstra, Tom Dykstra is a Senior Programming Writer on Micros ...
- 演练5-8:Contoso大学校园管理系统(实现存储池和工作单元模式)
在上一次的教程中,你已经使用继承来消除在 Student 和 Instructor 实体之间的重复代码.在这个教程中,你将要看到使用存储池和工作单元模式进行增.删.改.查的一些方法.像前面的教程一样, ...
- 重新整理 .net core 实践篇—————工作单元模式[二十六]
前言 简单整理一下工作单元模式. 正文 工作单元模式有3个特性,也算是其功能: 使用同一上下文 跟踪实体的状态 保障事务一致性 工作单元模式 主要关注事务,所以重点在事务上. 在共享层的基础建设类库中 ...
- 工作单元模式(UnitOfWork)学习总结
工作单元的目标是维护变化的对象列表.使用IUnitOfWorkRepository负责对象的持久化,使用IUnitOfWork收集变化的对象,并将变化的对象放到各自的增删改列表中, 最后Commit, ...
随机推荐
- Dapr 长程测试和混沌测试
介绍 这是Dapr的特色项目,具体参见: https://github.com/dapr/test-infra/issues/11 ,在全天候运行的应用程序中保持Dapr可靠性至关重要.在部署真正的应 ...
- 关于Struts访问不到静态资源的问题
今天重新配置了Struts的项目进行开发,但是项目静态资源一直访问不到. 将一些静态资源放在WebRoot下的static包下面便于管理. 一开始以为采用拦截.do,只拦截do后缀的请求,解决了静态资 ...
- Explain:你见过这样的Sql吗?
上一篇我们讲到Mysql索引底层逻辑,为了了解后续sql知识,我们还是需要先学习一下相关"工具"得使用 一.Explain介绍 EXPLAIN是MySQl必不可少的一个分析工具,主 ...
- JPA入门学习集合springboot(一)
1.在pom.xml文件中添加相应依赖 SpringData jpa和数据库MySql <!-- Spring Data JPA 依赖(重要) --> <dependency> ...
- CCS 2022 极客少年挑战赛 writeup
目录 题目一DSDS 操作内容: 题目二 easy_re 操作内容: flag值: 题目三 1+1=all 解题过程 题目一DSDS 操作内容: 开环境然后进入网址在网址后./目录 进入目录得到个 ...
- Hudi 数据湖的插入,更新,查询,分析操作示例
Hudi 数据湖的插入,更新,查询,分析操作示例 作者:Grey 原文地址: 博客园:Hudi 数据湖的插入,更新,查询,分析操作示例 CSDN:Hudi 数据湖的插入,更新,查询,分析操作示例 前置 ...
- 简读《ASP.NET Core技术内幕与项目实战》之3:配置
特别说明:1.本系列内容主要基于杨中科老师的书籍<ASP.NET Core技术内幕与项目实战>及配套的B站视频视频教程,同时会增加极少部分的小知识点2.本系列教程主要目的是提炼知识点,追求 ...
- 用昇腾AI护航“井下安全”
摘要:基于CANN(异构计算架构)打造的"智能矿山安全生产管理平台",能够更便捷和更高效地服务于更多矿山安全生产建设. 本文分享自华为云社区<华为携手云话科技助力矿山智能化, ...
- Windows骚操作
电脑常用的快捷键 键盘功能健:Tab.Shift.Ctrl.Alt.Windows.Enter.空格.上下左右健.CapsLock(大小写转换).NumLock(对小键盘控制开/关) 键盘快捷键:全选 ...
- Vue3 企业级优雅实战 - 组件库框架 - 6 搭建example环境
该系列已更新文章: 分享一个实用的 vite + vue3 组件库脚手架工具,提升开发效率 开箱即用 yyg-cli 脚手架:快速创建 vue3 组件库和vue3 全家桶项目 Vue3 企业级优雅实战 ...