聊一聊ABP vNext的模塊化系統

  • 官網

    https://abp.io/

  • 開源

    https://github.com/abpframework/abp 

  • EasyAbp

    https://easyabp.io/

  • Abp 模塊

    https://abp.io/packages

模塊化系統

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 void 
OnApplicationInitialization(ApplicationInitializationContext context)
    {
        var app = context.GetApplicationBuilder();
        var env = context.GetEnvironment();
        app.UseStaticFiles();
        app.UseRouting();
        app.UseConfiguredEndpoints();
    }
}

AbpModule 深度剖析

ABP 系統在啓動的時候纔會通過反射掃描所有模塊,每個模塊可以通過 DependsOnAttribute 特性來確定依賴關係,使用拓撲排序算法,來根據依賴性確定模塊的加載順序。(從最深層的模塊依次加載,直到啓動所有模塊)。

AbpModule 的提供一些方法來管理模塊的生命週期。

  • ConfigureServices:是將你的服務添加到依賴注入系統並配置其他模塊的主要方法。

  • OnApplicationInitialization:初始化配置的所有模塊的所有服務。

  • OnApplicationShutdown:如果要在應用程序關閉時執行。

  • ... 還有其他方法用的不多,下面流程圖會有簡單說明。

下面這個流程圖簡單闡述 AbpModule 提供的方法之間的執行順序。

AbpModule 類源代碼:

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

舉一個定時發郵件例子來說明這三個方法用處。

  • 自定義了一個定時發郵件模塊 SendMailModule 模塊並且繼承 AbpModule 。

  • 在 ConfigureServices 方法中配置定時發送的時間和發送郵箱的地址,郵件模塊信息等。

  • 配置好模塊之後,在 OnApplicationInitialization方法中啓動定時器,進行定時發送郵件。

  • 當系統停止後需要提醒運維人員,在 OnApplicationShutdown 方法中發送一封郵件給運維人員。

ABP 模塊化依賴價值流程

下面日誌闡述AbpModule 提供的方法在有模塊依賴的情況下之間的執行順序。

上圖的執行順序的演示代碼:

AbpModuleDemo.7z

總結

Abp vNext 是一個模塊化設計,提供了高擴展性、高可用性、高效率開發框架。要實現高效率前提還需要熟練了解使用 Abp 中的所有模塊功能。通過模塊設計也可以很快定製一下功能以及更好的單元測試。

Abp vNext 模塊設計是直接採用 Asp.NetCore 的原有功能,擴展了 Startup.ConfigureServices 和 Startup.Configure 方法,把方便我們在開發模塊的時候直接使用 IServiceCollection 和 IApplicationBuilder

模塊設計原則

  • 單一原則。每個模塊只有一個功能,有着清晰的邊界,實現高度解耦和高度可複用性。

  • DDD領域設計。通過領域設計思想確定模塊的領域邊界,避免模塊化過於細化導致增加複雜程度。

模塊使用常見問題

  • 模塊化過於細化,很容易陷入模塊的迷宮中。導致學習成本暴增。

  • 模塊功能文檔不清晰,使用起來問題頻出。

  • 模塊之間的過於依賴,對模塊設計和功能不瞭解時,很難定位問題。

引用

  • Abp vNext 源碼分析

    https://www.cnblogs.com/myzony/p/10722506.html

  • 官方文檔

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

轉載是一種動力 分享是一種美德

作者:阿凌

【版權聲明】作品來自於長沙.NET技術社區成員【阿凌】,有興趣瞭解長沙.NET技術社區詳情,請關注公衆號【DotNET技術圈】,作品版權歸作者和博客園共有,作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。

QQ羣:

編程交流羣<85318032> 

產品交流羣<897857351>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章