平时我们使用事务,需要显示的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. 浅谈-动态路由之OSPF的理解

    路由 在网络中,路由相当于就是一张地图,让路由器知道这个对应的IP数据包应该往哪端口.网段走:而这个"地图"我们称之为路由表,不同的目的IP路由表的下一个跳也不同,其生成方式有又有 ...

  2. [Android开发学iOS系列] iOS写UI的几种方式

    [Android开发学iOS系列] iOS写UI的几种方式 作为一个现代化的平台, iOS的发展也经历了好几个时代. 本文讲讲iOS写UI的几种主要方式和各自的特点. iOS写UI的方式 在iOS中写 ...

  3. 【高并发】ScheduledThreadPoolExecutor与Timer的区别和简单示例

    JDK 1.5开始提供ScheduledThreadPoolExecutor类,ScheduledThreadPoolExecutor类继承ThreadPoolExecutor类重用线程池实现了任务的 ...

  4. 华为交换机STP常用命令

    STP配置和选路规则 stp enable 在交换机上启用STP stp mode stp dis stp 查看stp配置 dis stp brief 查看接口摘要信息 stp priority 40 ...

  5. 我用canvas带你看一场流星雨

    前言 最近总是梦见一些小时候的故事,印象最深刻的就是夏天坐在屋顶上,看着满天的繁星,一颗,两颗,三颗...不由自主地开始了数星星的过程.不经意间,一颗流星划过夜间,虽然只是转瞬即逝,但它似乎比夜空中的 ...

  6. java.lang.Object类与equals()及toString()的使用

    1.Object类是所有Java类的根父类 2.如果在类的声明中未使用extends关键字指明其父类,则默认父类为java.lang.Object类 3.Object类中的功能(属性.方法)就具有通用 ...

  7. 齐博软件 著名的老牌CMS开源系统 X1.0基于thinkphp开发的高性能免费开源PHP开放平台齐博x1.0基于thinkphp框架开发的高性能免费开源系统 主推圈子 论坛 预定拼团分销商城模块

    齐博X1--标签变量大全 1.网站名称: {$webdb.webname} 2.网址: {$webdb[www_url]} {:get_url('home')} 3.网站SEO关键词: 首页:{$we ...

  8. 实现etcd服务注册与发现

    转载自:实现etcd服务注册与发现 0.1.目录结构 . ├── api │   └── main.go ├── common │   └── common.go ├── docker-compose ...

  9. MRR和Hits@n

    使用 MRR/Hits@n 评估链路预测 平均倒数秩(Mean reciprocal rank,MRR) MRR是一种衡量搜索质量的方法.我们取一个未被破坏的节点,找到距离定义为相似性分数的" ...

  10. 「MySQL高级篇」explain分析SQL,索引失效&&常见优化场景

    大家好,我是melo,一名大三后台练习生 专栏回顾 索引的原理&&设计原则 欢迎关注本专栏:MySQL高级篇 本篇速览 在我们上一篇文章中,讲到了索引的原理&&设计原则 ...