在系统性介绍整个ABP框架之前,我们首先需要对ABP框架有一个大概的了解,ABP框架的全称是:Asp.Net Boilerplate Project(即Asp.Net 的样板项目)顾名思义就是能够通过当前的项目模板来进行快速的Asp.Net开发,这个项目是一个GitHub上面非常流行的开源项目,整个项目的地址请点击这里,这个一个非常流行的框架,通过这个框架能够快速搭建Asp.Net项目,而且能够做到项目之间的分层,层与层之间通过接口进行调用,而且能够最大程度上保证整个项目层与层之间的松散耦合,从而做到真正地高内聚和低耦合,而且整个项目真正做到了DDD(领域驱动设计)思想,我们知道在领域驱动设计中,我们可以将整个系统分为四个大的层次,每一个层次都有其特定的功能,所以整个项目整体结构是非常清楚的,下面我们来逐一对这个框架进行论述。
一 概述
首先看看官方文档对其的解释
1 什么是Asp.Net Boilerplate?
ABP是一个新的现代网站应用程序的初始环境;它使用了最佳实践和许多受欢迎的工具。它的目标是成为一个所有人都可以使用,一个适用各种项目目标的应用程序框架以及项目样版。它做了那些事呢?
服务器端
A 基于最新版的ASP.Net MVC和WebAPI
B 实现了领域驱动设计(Domain Driven Design)(实体, 仓储, 领域服务, 应用服务, 数据传输对象, 工作单元... 等等)
C 实现了分层架构(Layered Architecture)(领域层, 应用层, 表现层和基础设施层)
D 提供一个开发上可重用的基础结构以及针对大型项目所需要的模块,并且这些模块都是可组合式的
E 采用那些你已经(或可能)已经在使用的最受欢迎框架/类库
F 提供一个基础且更易于使用的依赖注入机制(使用Castle Windsor作为DI的容器)
G 提供一个严谨的对象模型和基类,轻易的通过对象关系映射(Object-Relational Mapping)。(直接支持EntityFramework和NHibernate)。
H 支持且实现了数据库迁移(database migration)。
l 引入了一个简单且具弹性的多语言(localization)系统。
J 为服务器端的全局领域事(domain event)件引入了事件总线(EventBus)
K 管理异常处理和验证
L 为应用服务创建了动态Web API层
M 提供基类和帮助类予当你需要实现某些通用任务时
N 使用约定大于配置
客户端
A 为单页面应用(Single-Page Application)(有AngularJs和Durandaljs)和多页面应用提供项目样版。样版都是基于Twitter Bootstrap。
B 流行的Javascript类库都被引入进来,并且都已套用预设的配置
C 为了让调用应用服务(注: 使用动态的Web API层)变得更容易而创建动态Javascript代理(dynamic javascript proxies)
D 为了某些传递讯息型任务(Summon task)而引入一些独特的API,而所谓的传递讯息任务像是: 显示警告和通知,阻塞式UI,发出Ajax请求....等等。
除了上述的那些基础设施,还有一个名叫zero的模块正在开发中。它将会提供基于角色和权限的授权系统(实现最终版本的ASP.Net Identity Framework),也提供配置系统,多租户...等等能力。
2 ABP中的分层架构
ABP系统中采用DDD(领域驱动设计)的思想来构建整个软件,所以我们在使用代码的时候明显能够感觉到其分层架构的思想,具体的分层结构我们可以通过文字并配合下面的这张图进行理解。
展现层:当前层提供了一个面向用户的接口,使用应用层来和用户进行交互,这里我们可以简单理解成MVC中的View以及其它可以和用户进行交互的可视化方式,这一层只用于进行展示。
应用层:应用层是展示层和领域层之间的桥梁,在这一层我们可以定义一些应用的服务,同时定义DTO等一些对象, 同时我们在当前层定义一些常用的验证、配置、Session等一些常见的和用户直接交互的一些逻辑等。
领域层:包括一些业务对象和他们之间的一些规则,这个是整个应用的核心部分。
框架层:提供一些的一些服务设施,从而为上面更高层次提供基础服务,比如ORM以及Data Filters等对象。
看完了这些我们再来通过一张图片对其有一个大概的了解。
对着这个框架图,再谈一谈本人对这个架构的思考与理解:
展示层:前端展示层,及MVC中的V层,以及其它可供与用户进行交互的方式。
应用层(XXX.Application):主要是通过对外提供REST风格的WebAPI接口(使用ABP框架生成动态WebApi方式时),定义数据传输对象DTO,从而直接面向展示层提供接口,在内部会会调用领域层中定义的接口方法进行对外和对内数据操作,另外还会处理一些Authorization, Caching, Audit Logging, Object Mapping, Session等方面的操作,所有的这些都是通过和用户进行交互来完成的。
领域层(XXX.Core):最重要的是实现对具体业务的抽象建模,构建Model层,另外通过注入IRepository接口实现对Model的各种操作,最终完成实际业务的对接,这个是整个应用系统的核心部分,具体的操作会定义在继承自IDomainService接口的XXXManager中,并且最后将当前唯一实例注入到Application层中。
架构层(XXX.EntityFrameworkCore):主要是提供一个和底层数据库进行交互的接口,通过领域层定义Model,然后使用CodeFirst生成数据库表结构,最后通过IRepository接口和领域层进行交互,另外还可以定义一些Data Filter等一些列的基础设施服务,通过这些能够实现为更高一层提供基础服务。
二 系统特色
1 容器技术
一个大的系统通过构筑一个唯一的容器,并通过将接口和实现注入容器来进行交互的方式是一种非常流行的技术,在ABP项目中底层采用 Castle Windsor 作为依赖注入容器,能够将接口注入到容器中,并且在不同的构造函数中通过注入接口来完成交互,这个在一定的程度上能够减少代码之间的耦合性,最终提高代码的可复用性,最终实现整个软件系统的高内聚低耦合,最终使整个代码更加规范,很多大型的项目都会使用依赖注入容器的方式来管理整个项目的核心交互逻辑,是一种非常重要的技术。
2 模块化设计思想
整个系统通过构筑一个个Module作为逻辑上的分割,而且还通过定义统一的抽象基类AbpModule来完成整个ABP框架对底层模块进行控制,另外通过插件化的思想构筑可扩展的软件热插拔系统,从而在最大程度上实现软件系统的规整、可扩展功能,最终使整个软件系统更加成熟。
3 全面而完整的基础功能模块
整个ABP框架集成了非常多而且成熟的技术,诸如:EntityFrameworkCore、IdentityServer、Log4Net、RedisCache等一系列的基础功能,而且整个框架提供了Asp.Net MVC以及Asp.Net Core 的基础接口,功能完善,能够在最大的程度上减少重复造轮子的弊端,这些优点都使得整个框架更有特色,而且整个项目开源,所以能够按照自己的需要对项目进行定制化开发与维护。
三 项目源码分析
这里特别进行说明,下面所有代码分析都是针对ABP3.7.2版本,阅读时需要注意版本区别
5 ABP中的拦截器之ValidationInterceptor(上)
6 ABP中的拦截器之ValidationInterceptor(下)
7 ABP中的拦截器之AuditingInterceptor
8 ABP中的拦截器之EntityHistoryInterceptor
9 ABP中的拦截器之UnitOfWorkInterceptor(一)
10 ABP中的拦截器之UnitOfWorkInterceptor(二)
11 ABP拦截器之AuthorizationInterceptor