ABP使用及框架解析系列

摘要:
但是,如果嵌套的工作单元位于不同的主线程上,则每个主线程将具有不同的工作单元。具体实施将在ABP使用和框架解决系列中解决-[UnitofWorkpart.2-FrameworkImplementation]。

前言

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(1);

            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使用及框架解析系列》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【转】如何:排列和停靠窗口目录启动CXF启动报告LinkageError异常以及Java的endorsed机制下篇

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

相关文章

【推荐】HTML5 UI框架 推荐

笔者的男装网店:http://shop101289731.taobao.com 。冬装,在寒冷的冬季温暖你。新品上市,环境选购 最近自己瞎搞一下web网页的东西。想开发先找资源。 整理了一下HTML5的比较给力的UI开源框架: 1.Kendo UI : 官网地址: http://www.kendoui.com/ 推荐指数:★★★★☆ KendoUI是一款开...

SpringBoot框架:快速入门搭建运行一个应用程序(一)

一、环境配置 Java环境:1.8版本 开发工具:IntelliJIDEA 二、简单应用 1、创建项目 选择创建的项目类型为Spring Initializr,Project SDK选择1.8版本的java: 选择java版本为8,作为一个入门的简单应用,暂时无需配置其他的项,直接Next即可: 勾选Web中的Spring Web选项,点击Next:...

iOS图片加载框架-SDWebImage解读

在iOS的图片加载框架中,SDWebImage可谓是占据大半壁江山。它支持从网络中下载且缓存图片,并设置图片到对应的UIImageView控件或者UIButton控件。在项目中使用SDWebImage来管理图片加载相关操作可以极大地提高开发效率,让我们更加专注于业务逻辑实现。 SDWebImage 概论 1.提供了一个UIImageView的catego...

web快速开发框架 WebBuilder 8.7发布

一个强大的web开发框架往往与他开发速度有关,他需要帮助程序员尽可能快的完成项目的同时确保它的安全性,WebBuilder是基于Java的web开发框架,其核心开发目标是开发迅速,代码少,学习简单,功能强大,轻量级,易扩展。 WebBuilder开发框架具有以下特点: 1. 框架的主架构为基于Jaa 的 BS 架构。 2. 后台 ORM支持 多种模式。...

把ABP框架部署到Docker中

本文旨在将Abp项目部署到Docker容器中,借助Gitee存储,Jenkins持续构建,利用Docker Compose生成镜像、启动镜像,在官网给定的Abp项目中,虽然用到了Dockerfile、Docker Compose,但是没有资料指明该如何使用这两个文件,借此我通过改造这两个文件来完成Abp部署任务。 一、前期准备工作 1、把从Abp官网下载下...

2020 年了,Java 日志框架到底哪个性能好?——技术选型篇

大家好,之前写(shui)了两篇其他类型的文章,感觉大家反响不是很好,于是我乖乖的回来更新硬核技术文了。 经过本系列前两篇文章我们了解到日志框架大战随着 SLF4j 的一统天下而落下帷幕,但 SLF4j 仅仅是接口,实现方面, logback 与 log4j2 仍然难分高下,今天我们就来聊一聊,日志框架实现到底是该选择 Log4j2 还是 Logback...