聊一聊ABP vNext的模块化系统

  • 官网php

    https://abp.io/git

  • 开源github

    https://github.com/abpframework/abp 算法

  • EasyAbp缓存

    https://easyabp.io/安全

  • Abp 模块架构

    https://abp.io/packagesapp

 

 

模块化系统框架

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

ABP vNext 的世界观运维

在 Abp vNext 框架里面,模块系统是整个框架的基石,了解了模块系统之后,对于剩下的设计就很好理解了。

 

模块系统是就像上图乐高玩具同样,一块一块零散积木堆积起一个精彩的世界。每种积木的形状各不相同,功能各不相同,积木与积木直接互相依赖,互相支撑。

 

模块分两种类型. 它们没有任何结构上的差别,只是按照功能和目地分类:

  • 框架模块:这些是框架的核心模块,像缓存、邮件、主题、安全性、序列化、验证、Ef Core集成、MongoDB集成...等等。它们没有应用程序/业务功能,但经过提供通用基础架构,集成和抽象会使你的平常开发更加容易。

  • 应用程序模块:这些模块是实现特定的应用程序/业务功能,像 博客、文档管理、身份管理、租户管理... 等等。它是一般有本身的实体,服务,API和UI组件。

 

怎么使用模块?

Abp vNext 框架中这些模块怎么像积木同样互相拼装呢?

 

模块之间的拼装只有三步:

  • 第一步:创建模块直接的依赖关系,能够经过 DependsOnAttribute 特性来肯定依赖关系。

  • 第二步:先配置模块,实现为模块填充数据和功能设置。

  • 第三步:使用模块提供的功能(接口)。经过功能接口来实现模块拼装。

  •  
public class Startup{public void ConfigureServices(IServiceCollection services){services.AddApplication<AppModule>(); //配置启动的 Abp模块}public void Configure(IApplicationBuilder app){app.InitializeApplication(); //初始化 Abp模块}}

 

怎么自定义模块?

Abp vNext 规定每一个模块都应该定义一个模块类而且继承 AbpModule 抽象类。

 

  • 经过 DependsOnAttribute 特性来关联须要使用的模块。

  • 经过重写 OnApplicationInitialization方法来初始化模块。也能够配置 AspNetCore 处理管道。

  • 经过重写 ConfigureServices 方法来配置模块。

  •  
[DependsOn(typeof(ModuleThree.ModuleThreeModule))][DependsOn(typeof(ModuleOne.ModuleOneModule))][DependsOn(typeof(AbpAspNetCoreMvcModule))]public class AppModule : AbpModule{
public override void ConfigureServices(ServiceConfigurationContext context){// 配置依赖注入}
public override voidOnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();app.UseStaticFiles();app.UseRouting();app.UseConfiguredEndpoints();}}

 

AbpModule 深度剖析

ABP 系统在启动的时候才会经过反射扫描全部模块,每一个模块能够经过 DependsOnAttribute 特性来肯定依赖关系,使用拓扑排序算法,来根据依赖性肯定模块的加载顺序。(从最深层的模块依次加载,直到启动全部模块)。

 

AbpModule 的提供一些方法来管理模块的生命周期。

  • ConfigureServices:是将你的服务添加到依赖注入系统并配置其余模块的主要方法。

  • OnApplicationInitialization:初始化配置的全部模块的全部服务。

  • OnApplicationShutdown:若是要在应用程序关闭时执行。

  • ... 还有其余方法用的很少,下面流程图会有简单说明。

 

下面这个流程图简单阐述 AbpModule 提供的方法之间的执行顺序。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

AbpModule 类源代码:

https://github.com/abpframework/abp/blob/dev/framework/src/Volo.Abp.Core/Volo/Abp/Modularity/AbpModule.cs

 

举一个定时发邮件例子来讲明这三个方法用处。

  • 自定义了一个定时发邮件模块 SendMailModule 模块而且继承 AbpModule 。

  • 在 ConfigureServices 方法中配置定时发送的时间和发送邮箱的地址,邮件模块信息等。

  • 配置好模块以后,在 OnApplicationInitialization方法中启动定时器,进行定时发送邮件。

  • 当系统中止后须要提醒运维人员,在 OnApplicationShutdown 方法中发送一封邮件给运维人员。

 

ABP 模块化依赖价值流程

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

下面日志阐述AbpModule 提供的方法在有模块依赖的状况下之间的执行顺序。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上图的执行顺序的演示代码:

AbpModuleDemo.7z

 

总结

Abp vNext 是一个模块化设计,提供了高扩展性、高可用性、高效率开发框架。要实现高效率前提还须要熟练了解使用 Abp 中的全部模块功能。经过模块设计也能够很快定制一下功能以及更好的单元测试。

 

Abp vNext 模块设计是直接采用 Asp.NetCore 的原有功能,扩展了 Startup.ConfigureServices 和 Startup.Configure 方法,把方便咱们在开发模块的时候直接使用 IServiceCollection 和 IApplicationBuilder

 

 

模块设计原则

  • 单一原则。每一个模块只有一个功能,有着清晰的边界,实现高度解耦和高度可复用性。

  • DDD领域设计。经过领域设计思想肯定模块的领域边界,避免模块化过于细化致使增长复杂程度。

     

模块使用常见问题

  • 模块化过于细化,很容易陷入模块的迷宫中。致使学习成本暴增。

  • 模块功能文档不清晰,使用起来问题频出。

  • 模块之间的过于依赖,对模块设计和功能不了解时,很难定位问题。

     

引用

  • Abp vNext 源码分析

  • 官方文档

    https://docs.abp.io/zh-Hans/abp/latest/Module-Development-Basics

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk= watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=
相关文章
相关标签/搜索