本节目录

介绍

UOW(全称UnitOfWork)是指工作单元.

在Abp中,工作单元对于仓储和应用服务方法默认开启。并在一次请求中,共享同一个工作单元.

同时在Abp中,不仅支持同一个数据库连接,还支持事务处理.

分析Abp源码

1.UnitOfWorkRegistrar

2.ComponentRegistered

3.IsConventionalUowClass

4.Intercept

5.PerformSyncUow

实现UOW

定义IUnitOfWork

    public interface IUnitOfWork
{
//1.开启事务
//2.设置Filter(本例中不做演示)
void Begin(UnitOfWorkOptions options); void Complete();
}
public class UnitOfWorkOptions
{
public bool? IsTransactional { get; set; }
}

实现uow,在uow中会提供db的创建,这样才能管理到每个db.

    public class EfUnitOfWork : UnitOfWorkBase
{
public static DbContext DbContext { get; set; } public static DbContext GetDbContext()
{
if (DbContext == null)
{
DbContext = new DemoDb();
}
return DbContext;
} public override void Begin(UnitOfWorkOptions options)
{
if (options.IsTransactional == true)
{
CurrentTransaction = new TransactionScope();
}
} public TransactionScope CurrentTransaction { get; set; } public override void Complete()
{
SaveChanges();
if (CurrentTransaction != null)
{
CurrentTransaction.Complete();
}
} private void SaveChanges()
{
DbContext.SaveChanges();
}
}
public abstract class UnitOfWorkBase : IUnitOfWork
{
public virtual void Begin(UnitOfWorkOptions options)
{
} public virtual void Complete()
{
}
}

定义与实现仓储层,这里不再做DbProvider.

    public interface IRepository
{ } public interface ITaskRepository : IRepository
{
void Add(Task task);
} public class TaskRepository : ITaskRepository
{
public void Add(Task task)
{
var db = (DemoDb)EfUnitOfWork.GetDbContext();
db.Tasks.Add(task);
}
}

定义与实现应用层

    public interface IApplicationService
{ } public interface ITaskAppService : IApplicationService
{
void CreateTask(CreateTaskInput input);
} public class TaskAppService : ITaskAppService
{
private ITaskRepository _repository;
public TaskAppService(ITaskRepository repository)
{
_repository = repository;
}
public void CreateTask(CreateTaskInput input)
{
_repository.Add(new Task(input.Name));
}
} public class CreateTaskInput
{
public string Name { get; set; }
}

定义与实现uow拦截器

    internal class UnitOfWorkInterceptor : IInterceptor
{
private IUnitOfWork _unitOfWork;
public UnitOfWorkInterceptor(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public void Intercept(IInvocation invocation)
{
_unitOfWork.Begin(new UnitOfWorkOptions());
invocation.Proceed();
_unitOfWork.Complete();
}
}

定义在IApplicationService与IRepository接口下拦截

        static void Kernel_ComponentRegistered(string key, Castle.MicroKernel.IHandler handler)
{
var type = handler.ComponentModel.Implementation;
if (typeof(IApplicationService).IsAssignableFrom(type) || typeof(IRepository).IsAssignableFrom(type))
{
handler.ComponentModel.Interceptors.Add(new InterceptorReference(typeof(UnitOfWorkInterceptor)));
}
}

执行

        static void Main(string[] args)
{
using (var container = new WindsorContainer())
{
container.Register(Component.For<IInterceptor, UnitOfWorkInterceptor>());//先注入拦截器
container.Register(Component.For<IUnitOfWork, EfUnitOfWork>());
container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;
container.Register(Component.For<ITaskAppService, TaskAppService>());
container.Register(Component.For<ITaskRepository, TaskRepository>());
var person = container.Resolve<ITaskAppService>();
person.CreateTask(new CreateTaskInput() { Name = "3333" });
}
Console.ReadKey();
}

会自动在application method的结尾调用Complete.

另外也可以在uow上定义option为启用事务.在本例中稍作扩展即可实现.

本文地址:http://neverc.cnblogs.com/p/5263558.html

[Architect] Abp 框架原理解析(5) UnitOfWork的更多相关文章

  1. [Architect] Abp 框架原理解析(4) Validation

    本节目录 介绍 DataAnnotations ICustomValidate IShouldNormalize 实现Abp Validation 介绍 Abp中在Application层集成了val ...

  2. [Architect] Abp 框架原理解析(3) DynamicFilters

    本节目录 介绍 定义Filter 设置Filter 这是Abp中多租户.软删除.激活\禁用等如此方便的原因 Install-Package EntityFramework.DynamicFilters ...

  3. [Architect] Abp 框架原理解析(2) EventBus

    本节目录 原理介绍 Abp源码分析 代码实现 原理介绍 事件总线大致原理: (1)       在事件总线内部维护着一个事件与事件处理程序相映射的字典. (2)       利用反射,事件总线会将实现 ...

  4. [Architect] Abp 框架原理解析(1) Module

    本节目录 Abp介绍 Abp源码分析 代码实现 Abp介绍 学习了一段时间的Abp,领略了一下前辈的架构.总结还是SOLID,降低耦合性. 虽然从架构上说甚至不依赖于DI框架,但实际上在基础框架中还是 ...

  5. [Architect] ABP(现代ASP.NET样板开发框架) 翻译

    所有翻译文档,将上传word文档至GitHub 本节目录: 简介 代码示例 支持的功能 GitHub 简介 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目) ...

  6. ABP架构解析

    ABP总体介绍 ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称. ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应 ...

  7. [置顶] 滴滴插件化VirtualAPK框架原理解析(二)之Service 管理

    在前一篇博客滴滴插件化框架VirtualAPK原理解析(一)之插件Activity管理 中VirtualAPK是如何对Activity进行管理的,本篇博客,我们继续来学习这个框架,这次我们学习的是如何 ...

  8. ADB运行框架原理解析【转】

    本文转载自:http://blog.csdn.net/wlwl0071986/article/details/50935496 一.adb守护进程的初始化 源码路径:~/system/core/adb ...

  9. Java并发Fork-Join框架原理解析

    1.什么是Foirk/Join框架 Fork/Join框架是Java7提供用于并行执行任务的框架,是一个把大任务分割成若干个小任务,最终汇总每个小任务结果后得到大任务结果的框架. 2.什么是并行流与顺 ...

随机推荐

  1. 解决 The Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path

    到 http://tomcat.heanet.ie/native/ 下载最新的tcnative-1.dll放到相应目录即可,我目前下载的是 http://tomcat.heanet.ie/native ...

  2. oracle中分组排序函数用法 - 转

    项目开发中,我们有时会碰到需要分组排序来解决问题的情况,如:1.要求取出按field1分组后,并在每组中按照field2排序:2.亦或更加要求取出1中已经分组排序好的前多少行的数据 这里通过一张表的示 ...

  3. STM32 SPI DMA 的使用

    一是想总结一下SPI总线的特点与注意点,二是总结一下SPI DMA的使用 一.SPI信号线说明 通常SPI通过4个引脚与外部器件相连: MISO:主设备输入/从设备输出引脚.该引脚在从模式下发送数据, ...

  4. Eclipse中如何修改SVN的地址

    在SVN服务端的IP更改后,客户端SVN的连接地址可以在Eclipse中进行修改,方法如下: 首先:在Eclipse中选择Windows-> Show View->others 就会出现[ ...

  5. Oracle数据库入门——物化视图日志结构

    物化视图的快速刷新要求基本必须建立物化视图日志,这篇文章简单描述一下物化视图日志中各个字段的含义和用途. 物化视图日志的名称为MLOG$_后面跟基表的名称,如果表名的长度超过20位,则只取前20位,当 ...

  6. seajs集成jquery的一个坑

    var $ = require("jquery"); 今天在用seajs集成js的时候,老是发现$获取不到,但是文件又加载进去了,后来找了半天发现是这个问题. 本质的原因在于sea ...

  7. 年底奉献-QT编写视频监管平台(开源)

    忙忙碌碌又是一年,算算自己毕业四年半,一直在现在这家公司做研发外加总经理助理,研发起初用的VB.NET,而后全面转为C#,最后又全面转为QT,都是由于项目需要,算下来自己搞QT编程也已经四年了,201 ...

  8. C#的回调被C++调用

    __stdcall 要加这个 extern "C" __declspec(dllexport) 要用这样的东东 定义 extern "C" __declspec ...

  9. Ubuntu下PHP的扩展

    Ubuntu版本:14.04 1. 下载php-5.5.10.tar.bz2,并解压. 2.  终端进入解压后的目录php-5.5.10,运行configure.(输入命令./configure) 3 ...

  10. 【weka应用技术与实践】过滤器

    weka中的过滤器主要用于数据预处理阶段对数据集的各种操作. 今天简单地使用一下过滤器: 首先打开一个自带数据集weather.numeric.arff,这是一个关于通过天气条件,气温以及风力等因素来 ...