1、ABP背后的思想——DDD(领域驱动设计)
ABP架构:
ABP实现了多层架构(领域层,应用层,基础设施层和表示层),以及领域驱动设计(实体,存储库,领域服务,应用程序服务,DTO等)。还实现和提供了良好的基础设施来实现最佳实践,如依赖注入。
2、ABP——基于领域驱动设计的分层模型
2.1、什么是ABP
ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。
ASP.NET Boilerplate是一个用最佳实践和流行技术开发现代WEB应用程序的新起点,它旨在成为一个通用的WEB应用程序框架和项目模板。ABP是基于最新的ASP.NET CORE,ASP.NET MVC和Web API技术的应用程序框架。并使用流行的框架和库,它提供了便于使用的授权,依赖注入,验证,异常处理,本地化,日志记录,缓存等常用功能。
2.2、ABP的特点
- 模块化——ABP模块化系统,以模块的形式体现
- 多租户
- 认证和授权
- 后台作业
- AUTO API
- 事件总监
- 对象映射
- 数据过滤
- AOP
ABP是一套组合,AutoMapper\IdentityServer4\HangFire\.NET Core原生ID|Autofac,核心是ABP模块化系统,基础是领域驱动设计。
3、创建ABP的方式
方式1:使用ABP的模板,按照官网指示安装 ABP CLI,使用 ABP CLI 创建项目。
方式2:使用ABP的模板,直接在官网填写基本信息直接下载
方式3:在 Visual Studio 中创建 ASP.NET Core 新项目,引入 ABP 相关的包。
如果是快速开发可以使用 ABP 的模板,因为生成的项目比较复杂。如果想深入定制手动创建项目再引入 ABP 相关的包比较好。
4、模块
模块化的优点:
1)每个模块之间是没有必然联系的;
2)节约维护的成本;
模块之间需要依赖关系,并且有且只有一个启动模块,如果想应用其他模块,就需要在启动模块上添加依赖关系——DependsOn。
每个模块注册的服务,其实都注册到了全局容器中。
4.1、模块的类型:
1)应用程序模块:实现了特定的功能,通常有自己的服务、API和UI组件;
2)框架模块:框架的核心模块,比如缓存、安全、主题、序列化等,他们都是没有业务功能的,只是提供开发中的常用功能。
4.2、一个模块的生命周期:
模块配置、模块的初始化和模块的销毁
1)模块配置
当我们调用ABP模块的初始化方法的时候,模块的配置是最先被执行的。
模块配置会依此执行下列三个方法:
- public override voidPreConfigureService( );
- public override void ConfigureServices( );
- public override void PostConfigureServices( );
2)模块的初始化
public override void OnPreApplicationInitialization( );
public override void OnApplicationInitialization( );
public override void OnPostApplicationInitialization( );
3)模块的销毁
模块的存活期是跟随整个应用的,只有应用被终止,模块才会被销毁。
如果想在程序终止时,执行某段代码可使用:
public override void OnPostApplicationShutdown( );方法
5、模块之间的依赖
A-》B-》D
A-》C-》D
利用拓扑依赖算法,来根据依赖性确定模块的加载顺序:
先从最顶层的模块开始加载(D),然后依次往下,启动模块永远是最后被加载!(启动模块是唯一的)
所有模块都不可能依赖启动模块。
没有被依赖的模块不会被加载。
如:先加载AbpAspNetCoreMvcModule模块,再加载AbpModule模块
6、ABP的启动流程
最核心是初始化ABP各个模块。
1)注册ABP基础设施与核心服务(模块系统相关);
2)加载整个运用的所有模块,按照依赖性排序;
3)按顺序遍历所有模块,执行每一个模块的配置方法;
4)按顺序遍历所有模块,执行每一个模块的初始化方法
7、依赖注册的方式:
1)手动注册
通过配置方法中进行注册,也可以再Startup类中进行注册
2)自动注册
- 按约定注册——ABP会根据一些类型进行自动注册
- 按依赖接口注册:
- 依赖特性注册——可以通过特性方式定义
8、领域驱动设计
领域驱动设计(DDD)中,最重要的是领域层,领域层中最重要的就是领域模型。
领域模型关键部分:实体和值对象
1)实体:多个属性操作行为的一种载体,是领域模型的一种基础单元。
代码中是以实体类表现。
在系统运行中实体为一种领域对象,拥有唯一ID。
2)值对象
9、聚合以及聚合根:
1)聚合——实体组合而成,实体逻辑是紧密关联的(属于领域层)
- 表示一种强关联的关系,是一种整体与部分的关系,不强调整体与部分的独立性;
- 每一个聚合都对应一个仓储,以实现数据的持久化
2)聚合根——聚合的管理者
- 每一个聚合都有一个聚合根;
- 聚合根的目的:避免由于复杂的数据模型,缺少一个统一的业务规则控制,而导致聚合于实体之间不一致性的问题;
- 聚合根本质上也是一个实体(根实体);
- 聚合根与根具有相同的生命周期;
10、DDD的分层架构
11、什么是仓储?
- 仓储是用来协调领域(实体)和数据映射层(ORM)的。
- 仓储隔离了领域模型,使得只关注领域模型,而不考虑持久化
- 仓储的作用对象是领域模型中的聚合根。
仓储限定了只能通过聚合根来持久化和检索领域对象,以确保所有的改动都有聚合来处理。
仓储通过隐藏聚合持久化和检索的底层技术,实现了领域层的持久化无关系。
仓储作为数据模型和领域模型的一个中介,负责映射领域模型到持久化存储。