聊一聊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=
相關文章
相關標籤/搜索