ABP模塊系統
基於DDD的現代ASP.NET開發框架--ABP系列之4、ABP模塊系統
ABP是“ASP.NET Boilerplate Project (ASP.NET樣板項目)”的簡稱。
ABP的官方網站:http://www.aspnetboilerplate.com
ABP在Github上的開源項目:https://github.com/aspnetboilerplate
本文由東莞-天道提供翻譯
ABP模塊系統簡介
ABP框架提供了創建和組裝模塊的基礎,一個模塊能夠依賴於另一個模塊。在通常情況下,一個程序集就可以看成是一個模塊。在ABP框架中,一個模塊通過一個類來定義,而這個類要繼承自AbpModule。
譯者注:如果學習過Orchard的朋友,應該知道module模塊的強大了。模塊的本質就是可重用性,你可以在任意的地方去調用,而且通過實現模塊,你寫的模塊也可以給別人用。
Assembly程序集:Assembly是一個包含來程序的名稱,版本號,自我描述,文件關聯關系和文件位置等信息的一個集合。最簡單的理解就是:一個你自己寫的類庫生成的dll就可以看做是一個程序集,這個程序集可以包括很多類,類又包括很多方法等。
.net可以通過反射獲取一個程序集中的類以及方法。
下面的例子,我們開發一個可以在多個不同應用中被調用MybolgApplication模塊,代碼如下:
public class MyBlogApplicationModule : AbpModule //定義 { public override void Initialize() //初始化 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); //這行代碼的寫法基本上是不變的。它的作用是把當前程序集的特定類或接口注冊到依賴注入容器中。 } }
ABP框架會掃描所有的程序集,並且發現AbpModule類中所有已經導入的所有類,如果你已經創建了包含多個程序集的應用,對於ABP,我們的建議是為每一個程序集創建一個Module(模塊)。
生命期事件
在一個應用中,abp框架調用了Module模塊的一些指定的方法來進行啟動和關閉模塊的操作。我們可以重載這些方法來完成我們自己的任務。
ABP框架通過依賴關系的順序來調用這些方法,假如:模塊A依賴於模塊B,那么模塊B要在模塊A之前初始化,模塊啟動的方法順序如下:
- PreInitialize-B
- PreInitialize-A
- Initialize-B
- Initialize-A
- PostInitialize-B
- PostInitialize-A
下面是具體方法的說明:
PreInitialize
預初始化:當應用啟動后,第一次會調用這個方法。在依賴注入注冊之前,你可以在這個方法中指定自己的特別代碼。舉個例子吧:假如你創建了一個傳統的登記類,那么你要先注冊這個類(使用IocManager對登記類進行注冊),你可以注冊事件到IOC容器。等。
Initialize
初始化:在這個方法中一般是來進行依賴注入的注冊,一般我們通過IocManager.RegisterAssemblyByConvention這個方法來實現。如果你想實現自定義的依賴注入,那么請參考依賴注入的相關文檔。
PostInitialize
提交初始化:最后一個方法,這個方法用來解析依賴關系。
Shutdown
關閉:當應用關閉以后,這個方法被調用。
模塊依賴(Module dependencies)
Abp框架會自動解析模塊之間的依賴關系,但是我們還是建議你通過重載GetDependencies方法來明確的聲明依賴關系。
[DependsOn(typeof(MyBlogCoreModule))]//通過注解來定義依賴關系 public class MyBlogApplicationModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
例如上面的代碼,我們就聲明了MyBlogApplicationModule和MyBlogCoreModule的依賴關系(通過屬性attribute),MyBlogApplicationModule這個應用模塊依賴於MyBlogCoreModule核心模塊,並且,MyBlogCoreModule核心模塊會在MyBlogApplicationModule模塊之前進行初始化。
如何自定義的模塊方法
我們自己定義的模塊中可能有方法被其他依賴於當前模塊的模塊調用,下面的例子,假設模塊2依賴於模塊1,並且想在預初始化的時候調用模塊1的方法。
public class MyModule1 : AbpModule { public override void Initialize() //初始化模塊 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());//這里,進行依賴注入的注冊。 } public void MyModuleMethod1() { //這里寫自定義的方法。 } } [DependsOn(typeof(MyModule1))] public class MyModule2 : AbpModule { private readonly MyModule1 _myModule1; public MyModule2(MyModule1 myModule1) { _myModule1 = myModule1; } public override void PreInitialize() { _myModule1.MyModuleMethod1(); //調用MyModuleMethod1的方法。 } public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
就這樣,就把模塊1注入到了模塊2,因此,模塊2就能調用模塊1的方法了。
陽銘注:
ABP的模塊系統與Orchard的模塊有類似之處,但還是有比較大的差別。Orchard的框架修改了ASP.NET程序集的默認加載方式(模塊的DLL沒有放在Bin文件夾下,是放在WEB項目根文件夾下面的Modules文件夾下),實現了功能模塊的熱插拔,而ABP的模塊程序集還是放在Bin文件夾下的,沒有實現熱插拔。
希望更多國內的架構師能關注到ABP這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目可以發展得更好。
歡迎加ABP架構設計交流QQ群:134710707