Asp.Net Core 工作单元示例 来自 ABP UOW 去除所有无用特性


代码下载 :

去除所有无用特性版本,原生AspNetCore实现 差不多 2278 行代码:

链接:https://pan.baidu.com/s/1NoEIDSAPNr46xNHYEx9KCA
    提取码:570i

包含Castle.Windsor.MsDependencyInjection + 方法拦截器(Interceptor) 代理版本(Proxy)

链接:https://pan.baidu.com/s/1iL7PHofu3n0IKo_N5BEJhw
    提取码:i1m7


1. 什么叫工作单元?

跨多个请求的业务,统一管理事务,统一提交。

2. 为什么要工作单元?

我们经常的代码都是分层的,有可能到处都在 new DbContext(options),这是就要面对如何管理这些DbContext,在AspNetCore中 services.AddDbContext<>默认是用的Scope的作用域,也就是每次HttpRequest,比以前好了很多。但是事务这些管理还是很麻烦。

如上图 有一个Action需要调用很多Service 然后 Service之间又相互调用,在开启Action时 其实是想开启一个事务,但是某些内部代码有可能自己去开启了事务。相互之间调用管理起来非常麻烦。经常出现不可估计的问题。如果有一个集中管理的地方就好很多。比如在Action这里启动一个工作单元,后续所有的业务都使用同一个事务 和 DbContext,这才是我们的预期的。

3. 如何使用工作单元?

http://www.aspnetboilerplate.com/Pages/Documents/Unit-Of-Work

        //[UnitOfWork(IsDisabled = true)]//添加工作单元配置
public async Task<IActionResult> GetSystemInitSettings()
{
var defaultUsers = _dbContext.Users.Take().ToList();//以前的方式 注册的DbContext //测试1 获取DbContext
var dbContext = _dbContextProvider.GetDbContext();//IsolationLevel.ReadUncommitted //获取数据测试
var users = dbContext.Users.Take().ToList(); var importDataTask = ImportDataTask.CreateTask("test1", "", "userName", Entities.Enum.ImportDataType.无效导入, "", "", , "", ""); dbContext.ImportDataTasks.Add(importDataTask);
//1.如果调用当前
_unitOfWorkManager.Current.SaveChanges();//可以保存到数据库,但是如果UOW不提交则会因为事务回滚,这种情况可以先获取到数据的ID //** 因为是 事务提交 但是后面还有业务 数据库查询会Loading //测试环境2
using (var uow2 = _unitOfWorkManager.Begin(TransactionScopeOption.RequiresNew))//要求开启一个新的工作单元
{
var newDbContext = _dbContextProvider.GetDbContext(); var importDataTask2 = ImportDataTask.CreateTask("test2", "", "userName", Entities.Enum.ImportDataType.无效导入, "", "", , "", "");
newDbContext.ImportDataTasks.Add(importDataTask2); using (var uow3 = _unitOfWorkManager.Begin(new UnitOfWorkOptions
{
Scope = TransactionScopeOption.Required
}))//要求开启一个新的工作单元 Required 这里不会开启一个新的UOW
{
var innerDbContext = _dbContextProvider.GetDbContext(); if(innerDbContext == newDbContext)
{
;//相同DbContext
}
} uow2.Complete();//直接优先提交到数据库
} await Task.CompletedTask;// throw new Exception();//异常 默认UOW 会回滚 如果不异常保存到数据库,或者异常被捕获

4. 项目结构和依赖项?

Asp.Net Core 工作单元 UnitOfWork UOW的更多相关文章

  1. .NET Core 工作单元unitofwork 实现,基于NPOCO

    现有项目中的orm 并非efcore,而是非主流的npoco,本身没有自带工作单元所以需要自己手撸一个,现记录一下,基于其他orm的工作单元照例实现应该没有什么问题 该实现基于NPOCO,针对其他的O ...

  2. ASP.NET Boilerplate 工作单元

    从上往下说起,框架使用castle拦截器,拦截实现了IApplication.IRepository接口的所有方法,和使用了UnitOfWork 特性的方法,代码如下 internal class U ...

  3. .net core2.x - 关于工作单元(UnitOfWork) 模式

    概要:在搭建框架,顺手说下写下,关于unitofwork,可能你理解了,可能你还不理解,可能与不可能不是重点,重点是感兴趣就看看吧. 1.工作单元(unitofowork)是什么(后面简写uow)? ...

  4. ASP.NET Core搭建多层网站架构【4-工作单元和仓储设计】

    2020/01/28, ASP.NET Core 3.1, VS2019, Microsoft.EntityFrameworkCore.Relational 3.1.1 摘要:基于ASP.NET Co ...

  5. ABP官方文档翻译 3.6 工作单元

    工作单元 介绍 ABP中的连接和事务管理 传统的工作单元方法 控制工作单元 UnitOfWork特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 无事务工作单元 一个工作单元方法 ...

  6. ABP框架 - 工作单元

    文档目录 本节内容: 简介 在ABP中管理连接和事务 约定的工作单元 UnitOfWork 特性 IUnitOfWorkManager 工作单元详情 禁用工作单元 非事务性工作单元 工作单元方法调用另 ...

  7. [ABP]浅谈工作单元 在整个 ABP 框架当中的应用

    ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...

  8. 浅谈工作单元 在整个 ABP 框架当中的应用

    ABP在其内部实现了工作单元模式,统一地进行事务与连接管理. 其核心就是通过 Castle 的 Dynamic Proxy 进行动态代理,在组件注册的时候进行拦截器注入,拦截到实现了 Unit Of ...

  9. ASP.NET Core模块化前后端分离快速开发框架介绍之4、模块化实现思路

    源码 GitHub:https://github.com/iamoldli/NetModular 演示地址 地址:https://nm.iamoldli.com 账户:admin 密码:admin 前 ...

随机推荐

  1. 基于Django的Rest Framework框架的分页组件

    本文目录 一 简单分页(查看第n页,每页显示n条) 二 偏移分页(在第n个位置,向后查看n条数据) 三 CursorPagination(加密分页,只能看上一页和下一页,速度快) 回到目录 一 简单分 ...

  2. IT兄弟连 Java语法教程 注释与编码规范

    在程序代码中适当地添加注释可以提高程序的可读性和可维护性.好的编码规范可以使程序更易阅读和理解.下面将介绍Java中的集中代码注释以及应该注意的编码规范. 代码注释 通过在程序代码中添加注释可提高程序 ...

  3. MongoDB系列---集合与文档操作03

    MongoDB-——Collection 学习大纲: 1.集合操作 2.文档操作 知识回顾: 上一篇我们讲述了如何对MongoDB的权限和用户进行日常的基本操作,来达到我们对数据库的基本安全保障. 一 ...

  4. C#使用Emgu CV来进行图片人脸检测

    项目需求:某市级组织考试,在考试前需审核考生采集表中的考生照片是否合格,由于要审核的考生信息采集表有很多,原先进行的是手动人工审核,比较费时费力,审核的要求也很简单,并不判断考生是否是图片本人(身份验 ...

  5. Google浏览器出现崩溃问题解决

    更新google浏览器79版本后所有页面出现崩溃情况,在试过加no-sandbox和兼容模式之后还是不太满意,后来搜到可能是网络问题,然后打开google浏览器安装文件夹,发现chrome_proxy ...

  6. go-gui-控件和信号

    go-gui-控件和信号 控件 控件简介 控件是对数据和方法的封装.控件有自己的属性和方法.属性是指控件的特征.方法是指控件的一些简单而可见的功能.如按钮就是一个控件,这个按钮是方形的,里面有张图片, ...

  7. 接口测试基础--Fiddler、Postman、Python实现对接口的测试

    写在前面:本文主要的章节规划: 1.什么是接口测试    另外,有的时候会直接调用别的公司的接口,比如银行的.淘宝的.支付宝的,此时也需要做接口测试以及验证数据: 做接口测试的好处:      其中, ...

  8. SSM框架之Mybatis(3)dao层开发

    Mybatis(3)dao层开发 以实现类完成CRUD操作 1.持久层dao层接口的书写 src\main\java\dao\IUserDao.java package dao; import dom ...

  9. shell下判断文件夹或文件是否存在

    文件夹不存在则创建 if [ ! -d "/data/" ];then mkdir /data else echo "文件夹已经存在" fi 文件存在则删除 i ...

  10. sharepointOnline的外接应用创建

    #CODE STARTS HERE $programFiles = [environment]::getfolderpath("programfiles") add-type -P ...