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. Python连载49-正则举例

    一.re举例 import re #查找数字 p = re.compile(r"\d+") #在字符串“ongahjeuf125”中及逆行查找,按照规则p指定的正则进行查找 m = ...

  2. Long Jumps CodeForces - 479D

    E - Long Jumps CodeForces - 479D Valery is a PE teacher at a school in Berland. Soon the students ar ...

  3. 使用zabbix监控oracle的后台日志

    本文将介绍如何使用zabbix监控oracle的后台日志,当oracle后台日志出现“ORA-”或“Error”时,第一时间将该信息报警出来 zabbix agent端 以下所有操作均用root执行 ...

  4. MySQL 表和列的注释

    像代码一样,可以为表以及表中的列添加注释,方便其他人知晓其功能.对于一些字段,在经过一定时间后,创建者未必也能想起其具体的含意,所以注释显得尤为重要. 注释的添加 注释的添加是通过在定义表或列的时候在 ...

  5. 2018-8-10-win10-uwp-依赖属性

    原文:2018-8-10-win10-uwp-依赖属性 title author date CreateTime categories win10 uwp 依赖属性 lindexi 2018-08-1 ...

  6. javascript构造函数深度克隆递归

    <script type="text/javascript"> var obj={ name:'段丛磊', gex:18, sss:['李伟',18], fun:fun ...

  7. layui js 常用语句语法

    烂笔头: layui组件使用 注意layui的版本. 在head里需要引入css/js文件. 出现 form.verify,form.val is not a function的错误信息时,注意版本, ...

  8. vue中点击按钮复制内容

    <el-button type="primary" round size="mini" @click="copyUrl">复制u ...

  9. Event事件、进程池与线程池、协程

    目录 Event事件 进程池与线程池 多线程爬取梨视频 协程 协程目的 gevent TCP服务端socket套接字实现协程 Event事件 用来控制线程的执行 出现e.wait(),就会把这个线程设 ...

  10. 在ubuntu15.10上编译arm-linux环境使用的log4c步骤

    步骤: 1.下载log4c源码 2.解压源码包,我解压后的路径是:/home/cc/Downloads/log4c-1.2.4 3.执行以下shell脚本: #!/bin/sh mkdir /home ...