前言

ABP

ABP是“ASP.NET Boilerplate Project”的简称。

ABP的官方网站:http://www.aspnetboilerplate.com

ABP在Github上的开源项目:https://github.com/aspnetboilerplate

ABP其他学习博客推荐及介绍:http://www.cnblogs.com/mienreal/p/4528470.html

Unit of Work

Unit of Work 又称之为“工作单元”,Unit of Work的相关概念及介绍,请移步另一篇博客:设计模式/原则篇 - Unit of Work

在ABP中,因为不能确定开发人员实际使用的ORM和数据访问层具体是什么,为了更好的扩展性,ABP为Unit of Work封装了一套通用接口抽象,并提供了Entity Framework及NHibernate的实现。

使用

默认行为

在ABP中,ApplicationService(领域服务,实现IApplicationService接口的类)和Repository(实现IRepository接口的类)的每个方法默认都是一个工作单元。在方法的起始处就开始了一个事务,在方法的结束时,事务也会自动提交,如果这个方法中抛出了异常,事务会自动回滚。

public interface ISimpleAppService : IApplicationService
{
void ComplexOperation();
} public class SimpleAppService : ISimpleAppService
{
public void ComplexOperation()
{
//该方法默认就是一个工作单元
}
} public interface ISimpleRepository : IRepository<Simple, string>
{
List<Simple> GetAllByName(string name);
} public class SimpleRepository : ABPRepositoryBase<Simple, long>, ISimpleRepository
{
public List<Simple> GetAllByName(string name)
{
//该方法默认就是一个工作单元,ABPRepositoryBase默认有一些公共方法的实现,比如GetAll、Update这些
}
}

UnitOfWorkAttribute

另一种添加Unit of Work的方式,便是在方法上面添加UnitOfWork特性,这样便和上面的默认行为相同,该方法成为一个工作单元。

UnitOfWork特性,还包含一系列参数,Scope(事务参数)、IsTransactional(工作单元是否是事务)、Timeout(超时时间)、IsolationLevel(事务隔离级别)、IsDisabled(是否禁用工作单元,这个属性用于关闭领域服务和仓储库默认的方法即工作单元的设置)。

public class TempService
{
[UnitOfWork]
public void Method()
{
//TempService不是领域服务,没有实现IApplicationService接口,但是通过UnitOfWorkAttribute,使Method也成为一个工作单元
}
}
重要

标记UnitOfWork特性的方法的所在类,需要注册到IoC容器中,并通过IoC容器进行创建,类和方法的可访问级别需要为public或protected,因为ABP通过动态代理实现AOP进行切面编程,具体缘由将在ABP使用及框架解析系列 - [Unit of Work part.2-框架实现]中解析。

IUnitOfWorkManager

上面两种方式,其内部都是使用IUnitOfWorkManager进行单元控制的,所以我们也可以直接通过IUnitOfWorkManager进行控制,如下代码所示:

public class TempService
{
private IUnitOfWorkManager _uowManager;
private ITempRepository _tempRsy; public TempService(IUnitOfWorkManager uowManager, ITempRepository tempRsy)
{
this._uowManager = uowManager;
this._tempRsy = tempRsy;
} public void Method()
{
using (var uow = _uowManager.Begin())
{
_tempRsy.Insert(new Temp());
_tempRsy.Delete(); uow.Complete();
}
}
}

TempService并非领域服务,没有实现IApplicationService接口,所以Method方法默认不是一个工作单元。在Method内部,使用using块便是一个工作单元,通过uow.Complete()进行提交,如果出现异常,会自动回滚。

IUnitOfWorkManager的Begin方法可接受一系列参数对工作单元或事务进行设置,在这里就不对每个参数进行详细说明了。如有疑问,大家都已在评论中进行讨论。

上述三种方式为Unit of Work在ABP中的使用方式,下面还有一些ABP中Unit of Work的特性、配置及注意事项。

全局/默认配置

不论是在使用Attribute还是IUnitOfWorkManager,都是可以进行一些参数设置的,但是同时也是可以不对其进行设置的,当不对其进行设置时,将会使用默认参数,而这个默认参数,可以通过一个全局配置进行修改。

ABP有一个IUnitOfWorkDefaultOptions接口,并且通过IoC与UnitOfWorkDefaultOptions进行了单例依赖注册,所以通过IoC容器获取IUnitOfWorkDefaultOptions实例时,可以获取到Unit of Work全局默认配置,通过修改这个对象里的参数,可以修改其默认配置。但是需要注意的是,这个配置是一个全局配置,所以随便在一个地方就进行修改不是一个好的做法。

ABP中有一个模块(AbpModule)的概念,推荐在主项目的模块类的PreInitialize方法中进行修改。ABP也为此提供了更加便捷的方式进行修改默认配置,AbpModule类下有一个Configuration属性,该属对象齐聚了很多配置项,其中UnitOfWork属性便是IUnitOfWorkDefaultOptions接口对象,通过这个便可方便的修改默认配置了。

其他特性

1.支持多个工作单元嵌套,它们共用最外层的工作单元。但如果嵌套的工作单元在不同主线程上,则每个主线程会有一个不同的工作单元,具体实现将在ABP使用及框架解析系列 - [Unit of Work part.2-框架实现]中解析。

2.在工作单元中,进行数据查询,如有返回IQueryable,需要再工作单元内进行ToList或ToArray等操作,因为返回IQueryable对象时并没有进行真正的数据操作(延迟执行),而数据库连接会在工作单元结束后关闭,所以如果再工作单元结束后进行ToList等操作,会抛出异常(当然,这里说的是ABP提供的NH和Ef的实现,自己实现ABP接口可以自行限制)。

3.Unit of Work除了提供了Complete外,还提供了SaveChanges方法,用于先行提交数据。在Entity主键为自增ID,并且后续操作需要这个ID时,可以通过先SaveChanges来提交数据来获取自增ID值。

4.在使用ABP提供的EF实现中,在工作单元中对Entity进行修改后,即使不手动调用Update,在UoW结束时也会自动保存修改,因为Ef对Entity的状态进行了跟踪,并且在UoW进行Complete操作前,会先SaveChanges(NH没有仔细研究)。

5.可以为Unit of Work注册三个事件:Completed、Failed、Disposed。这三个事件,在IUnitOfWorkManager对象的Current属性定义。

框架实现

由于框架实现内容较多,为了不导致篇幅过长,框架实现部分,请移步 ABP使用及框架解析系列 - [Unit of Work part.2-框架实现]

ABP使用及框架解析系列 - [Unit of Work part.1-概念及使用]的更多相关文章

  1. ABP使用及框架解析系列 - [Unit of Work part.2-框架实现]

    前言 ABP ABP是“ASP.NET Boilerplate Project”的简称. ABP的官方网站:http://www.aspnetboilerplate.com ABP在Github上的开 ...

  2. Abp Vnext源码解析系列文章01---EventBus

    一.简介 BP vNext 封装了两种事件总线结构,第一种是 ABP vNext 自己实现的本地事件总线,这种事件总线无法跨项目发布和订阅.第二种则是分布式事件总线,ABP vNext 自己封装了一个 ...

  3. ABP(现代ASP.NET样板开发框架)系列之12、ABP领域层——工作单元(Unit Of work)

    点这里进入ABP系列文章总目录 基于DDD的现代ASP.NET开发框架--ABP系列之12.ABP领域层——工作单元(Unit Of work) ABP是“ASP.NET Boilerplate Pr ...

  4. ABP开发框架前后端开发系列---(1)框架的总体介绍

    ABP是ASP.NET Boilerplate的简称,ABP是一个开源且文档友好的应用程序框架.ABP不仅仅是一个框架,它还提供了一个最徍实践的基于领域驱动设计(DDD)的体系结构模型.学习使用ABP ...

  5. ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程

    在前面随笔介绍的<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>里面,介绍了如何改进和完善审计日志和登录日志的应用服务端和Winform客户端,由于篇幅限制,没有进 ...

  6. 【安卓网络请求开源框架Volley源码解析系列】定制自己的Request请求及Volley框架源码剖析

    通过前面的学习我们已经掌握了Volley的基本用法,没看过的建议大家先去阅读我的博文[安卓网络请求开源框架Volley源码解析系列]初识Volley及其基本用法.如StringRequest用来请求一 ...

  7. ABP开发框架前后端开发系列---(3)框架的分层和文件组织

    在前面随笔<ABP开发框架前后端开发系列---(2)框架的初步介绍>中,我介绍了ABP应用框架的项目组织情况,以及项目中领域层各个类代码组织,以便基于数据库应用的简化处理.本篇随笔进一步对 ...

  8. ABP开发框架前后端开发系列---(2)框架的初步介绍

    在前面随笔<ABP开发框架前后端开发系列---(1)框架的总体介绍>大概介绍了这个ABP框架的主要特点,以及介绍了我对这框架的Web API应用优先的一些看法,本篇继续探讨ABP框架的初步 ...

  9. ABP开发框架前后端开发系列---(9)ABP框架的权限控制管理

    在前面两篇随笔<ABP开发框架前后端开发系列---(7)系统审计日志和登录日志的管理>和<ABP开发框架前后端开发系列---(8)ABP框架之Winform界面的开发过程>开始 ...

随机推荐

  1. 有一个团队协同工具,叫Worktile

    项目管理,本是一个老生常谈的话题,曾几何时大碗云集在这个市场,其中不乏出现像微软.SAP.IBM.用友这样的名字.复杂而又冗繁的流程控制,让人们划分成两类人,一类是会使用这些工具和系统的人,另一类是不 ...

  2. Linux下MongoDB服务安装

    Linux下MongoDB服务安装 MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案.MongoDB是一个介于关系数据库和非关系数据 ...

  3. 《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模

    2-3 无载荷(with NO Payload)的多对多关系建模 问题 在数据库中,存在通过一张链接表来关联两张表的情况.链接表仅包含连接两张表形成多对多关系的外键,你需要把这两张多对多关系的表导入到 ...

  4. 蓄水池(Reservoir_sampling)抽样算法简记

    摘要 1.适用场合 2.算法简介 3.代码例子 4.Spark RangePartitioner 中的应用(待补充) 内容 1.适用场合:从包含n个项目的集合S中选取k个样本,其中n为一很大或未知的数 ...

  5. 生成模型(Generative Model)与判别模型(Discriminative Model)

    摘要: 1.定义 2.常见算法 3.特性 4.优缺点 内容: 1.定义 1.1 生成模型: 在概率统计理论中, 生成模型是指能够随机生成观测数据的模型,尤其是在给定某些隐含参数的条件下.它给观测值和标 ...

  6. Underscore.js使用

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象. 他解决了这个问题:"如果我面对一个空白的 ...

  7. Java伪界面操作数据库的小实例

    首先在Mysql中有两个表fruit和login: package com.zuoye; import java.sql.*; import java.util.*; public class Tes ...

  8. 细说Linq之Aggregate

    前言 Linq中有关常见的方法我们已经玩的得心应手,而对于那些少用的却是置若罔闻(夸张了点),但只有在实际应用中绞尽脑汁想出的方法还不如内置的Linq方法来的实际和简洁,不喜勿喷,怪我见识短. 通过R ...

  9. .cn根服务器被攻击之后

    如果是互联网行业的人员应该知道,8月25日凌晨,大批的“.cn”域名的网站都无法访问,当然包括weibo.cn等大型网站.个人比较奇怪的一件事情是,微博PC网页版是:www.weibo.com,而mo ...

  10. Android动画学习(二)——Tween Animation

    前两天写过一篇Android动画学习的概述,大致的划分了下Android Animation的主要分类,没有看过的同学请移步:Android动画学习(一)——Android动画系统框架简介.今天接着来 ...