什么是ABP?

1、ABP背后的思想——DDD(领域驱动设计)

ABP架构:

ABP实现了多层架构(领域层,应用层,基础设施层和表示层),以及领域驱动设计(实体,存储库,领域服务,应用程序服务,DTO等)。还实现和提供了良好的基础设施来实现最佳实践,如依赖注入。

2ABP——基于领域驱动设计的分层模型

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.2ABP的特点

  • 模块化——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模块

6ABP的启动流程

最核心是初始化ABP各个模块

1)注册ABP基础设施与核心服务(模块系统相关);

2)加载整个运用的所有模块,按照依赖性排序;

3)按顺序遍历所有模块,执行每一个模块的配置方法;

4)按顺序遍历所有模块,执行每一个模块的初始化方法

7、依赖注册的方式:

1)手动注册

通过配置方法中进行注册,也可以再Startup类中进行注册

2)自动注册

  • 按约定注册——ABP会根据一些类型进行自动注册
  • 按依赖接口注册:

  • 依赖特性注册——可以通过特性方式定义

8、领域驱动设计

领域驱动设计(DDD)中,最重要的是领域层,领域层中最重要的就是领域模型。

领域模型关键部分:实体和值对象

1)实体:多个属性操作行为的一种载体,是领域模型的一种基础单元

代码中是以实体类表现。

在系统运行中实体为一种领域对象,拥有唯一ID

2)值对象

9、聚合以及聚合根:

1)聚合——实体组合而成,实体逻辑是紧密关联的(属于领域层)

  • 表示一种强关联的关系,是一种整体与部分的关系,不强调整体与部分的独立性;
  • 每一个聚合都对应一个仓储,以实现数据的持久化

2)聚合根——聚合的管理者

  • 每一个聚合都有一个聚合根
  • 聚合根的目的:避免由于复杂的数据模型,缺少一个统一的业务规则控制,而导致聚合于实体之间不一致性的问题;
  • 聚合根本质上也是一个实体(根实体);
  • 聚合根与根具有相同的生命周期;

10DDD的分层架构

11、什么是仓储?

  • 仓储是用来协调领域(实体)和数据映射层(ORM)的。
  • 仓储隔离了领域模型,使得只关注领域模型,而不考虑持久化
  • 仓储的作用对象是领域模型中的聚合根

仓储限定了只能通过聚合根来持久化和检索领域对象,以确保所有的改动都有聚合来处理。

仓储通过隐藏聚合持久化和检索的底层技术,实现了领域层的持久化无关系。

仓储作为数据模型和领域模型的一个中介,负责映射领域模型到持久化存储。

 

猜你喜欢

转载自blog.csdn.net/beiye_/article/details/131488538
ABP