官網:php
https://abp.io/git
開源:github
https://github.com/abpframework/abp 算法
EasyAbp:緩存
https://easyabp.io/安全
Abp 模塊:架構
https://abp.io/packagesapp
模塊化系統框架
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
提供的方法之間的執行順序。
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://docs.abp.io/zh-Hans/abp/latest/Module-Development-Basics