官網:
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>