ABP框架 UnitOfWorkAttribute

摘要:
此ICurrentUnitOfWorkProvider是设置Unitofwork值的关键,同时也设置IUnitofwork变量的内部外部。工作单元完成后,ICurrentUnitOfWorkProvider.Current的值设置为空,以准备下一个工作单元。该值是从当前工作单元创建的,ICurrentUnitOfWorkProvider将工作单元与仓库连接起来。外部工作单位来自IUnitOfWork。外部看看这个图。这是一个类,该类中有几个方法。

记录下:

使用Castle.DynamicProxy实现动态代理

  参考项目地址:https://github.com/f135ta/SimpleProxy

  要点:

    方法上的 Attribute 与 对应的拦截器一一对应

    具体的Proxy由Castle.DynamicProxy实现

创建UnitOfWork

  1.由IUnitOfWorkManager在内部创建

ABP框架 UnitOfWorkAttribute第1张

   2. 创建 IUnitOfWork

  ABP框架 UnitOfWorkAttribute第2张

   这里使用到了 _currentUnitOfWorkProvider 类来获取已存在的  IUnitOfWork。

    注意 “AsyncLocal” 用法 多线程共享变量,

    在异步情况下(async await) 等待之前的线程 与 等待之后的线程可能不是同一个线程。

  ABP框架 UnitOfWorkAttribute第3张

  这个   ICurrentUnitOfWorkProvider 很关键

  设置Unitofwork值的,也将IUnitofwork变量内部 Outer 设置了。

  当该工作单元完成后,  ICurrentUnitOfWorkProvider.Current  的值就设置成了null,为下一个工作单元做准备。

仓储中的DbContext从何而来

  如图:

  ABP框架 UnitOfWorkAttribute第4张

   再看下 IDbContextProvider 内部,这里以EF 为例。

  ABP框架 UnitOfWorkAttribute第5张

   值是从当前的工作单元中创建,由

  ABP框架 UnitOfWorkAttribute第6张

   ICurrentUnitOfWorkProvider 将 工作单元仓储 连接 。

  换句话说,工作单元 与 仓储操 操作的DbContext 是同一个。

外部工作单元从何而来IUnitOfWork.Outer

  看图,这是个类,类中有几个方法。

    ABP框架 UnitOfWorkAttribute第7张

   由ioc容器创建该类,顺便注入了仓储与 工作单元管理器。

   在BeforeRun方法中手动创建了一个工作单元,using语句块中执行 _userRepository.Insert 方法时,会在 UnitOfWorkInterceptor 拦截器中执行(如下图) 创建工作单元

    ABP框架 UnitOfWorkAttribute第8张

   在此时刻,由于手动创建的工作单元没执行 Complete()方法,那么 多线程共享变量(如下图AsyncLocalCurrentUnitOfWorkProvider继承ICurrentUnitOfWorkProvider 对Current的实现)

     ICurrentUnitOfWorkProvider.Current 值没设置为null。

  ABP框架 UnitOfWorkAttribute第9张

   那么此时拦截器中创建的工作单元就 等于 手动创建的工作单元。

  如图:表示工作单元已存在

      ABP框架 UnitOfWorkAttribute第10张

   

   

免责声明:文章转载自《ABP框架 UnitOfWorkAttribute》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇WPF如何实现类似iPhone界面切换的效果(转载)软件过程模型(软件开发模型)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

HBase之七:事务和并发控制机制原理

作为一款优秀的非内存数据库,HBase和传统数据库一样提供了事务的概念,只是HBase的事务是行级事务,可以保证行级数据的原子性、一致性、隔离性以及持久性,即通常所说的ACID特性。为了实现事务特性,HBase采用了各种并发控制策略,包括各种锁机制、MVCC机制等。本文首先介绍HBase的两种基于锁实现的同步机制,再分别详细介绍行锁的实现以及各种读写锁的应...

Java并发机制和底层实现原理

  Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码转化为汇编指令在CPU上执行。Java中的并发机制依赖于JVM的实现和CPU的指令。      Java语言规范第三版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排它锁单独获得这个变量...

多线程详细介绍

什么是进程线程:我们来看一下自己的任务管理器 这里的每一项都是一个进程,我们的发布的每一个应用程序都需要一个进程去运行,在一个进程内可以有多个线程去计算执行程序。我们看下面的图片: 我们可以看一下进程和线程的数量,很明显可以看出,线程和进程的关系。我们的每一个操作都需要一个线程来执行,鼠标的点击就需要线程去响应我们的操作。 现在我们不难理解,我们一个应...

Python thread & process

线程 点击查看 <- 进程 点击查看 <- 线程与进程的区别 线程共享内部空间;进程内存空间独立 同一个进程的线程之间可以直接交流;两个进程之间想通信必须通过一个中间代理 创建新线程很简单,占用资源较少;创建新进程是对父进程的克隆,会占用很多资源 一个线程可以控制和操作同一进程里的其他线程;但是进程只能操作子进程 修改父线程可能会影响到进程下...

封装GCD以及介绍如何使用

源码地址 http://pan.baidu.com/s/1zTUR8 研究GCD有一段时间,翻译了多篇文章,找了很多的资料,看了很多官方文档,看起来很难,实际上很简单,本人一一进行讲解怎么使用. 支持ARC以及非ARC,无论在ARC环境还是在非ARC环境,都需要调用dispatchRelease方法来释放init出的GCDGroup,GCDQueue,G...

网络socket编程实现并发服务器——多线程编程

一、多线程简介1、什么是线程?       线程在操作系统原理中是这样描述的:线程是进程的一条执行路径。线程在Unix系统下,通常被称为轻量级的进程,线程虽然不是进程,但却可以看作是Unix进程的表亲,所有的线程都是在同一进程空间运行,这也意味着多条线程将共享该进程中的全部系统资源,如虚拟地址空间,文件描述符和信号处理等等。但同一进程中的多个线程有各自的调...