點這裏進入ABP系列文章總目錄html
基於DDD的現代ASP.NET開發框架--ABP系列之四、ABP模塊系統
git
ABP是「ASP.NET Boilerplate Project (ASP.NET樣板項目)」的簡稱。github
ABP的官方網站:http://www.aspnetboilerplate.com架構
ABP在Github上的開源項目:https://github.com/aspnetboilerplate框架
本文由東莞-天道提供翻譯 ide
ABP框架提供了建立和組裝模塊的基礎,一個模塊可以依賴於另外一個模塊。在一般狀況下,一個程序集就能夠當作是一個模塊。在ABP框架中,一個模塊經過一個類來定義,而這個類要繼承自AbpModule。學習
譯者注:若是學習過Orchard的朋友,應該知道module模塊的強大了。模塊的本質就是可重用性,你能夠在任意的地方去調用,並且經過實現模塊,你寫的模塊也能夠給別人用。網站
Assembly程序集:Assembly是一個包含來程序的名稱,版本號,自我描述,文件關聯關係和文件位置等信息的一個集合。最簡單的理解就是:一個你本身寫的類庫生成的dll就能夠看作是一個程序集,這個程序集能夠包括不少類,類又包括不少方法等。
.net能夠經過反射獲取一個程序集中的類以及方法。spa
下面的例子,咱們開發一個能夠在多個不一樣應用中被調用MybolgApplication模塊,代碼以下: .net
public class MyBlogApplicationModule : AbpModule //定義 { public override void Initialize() //初始化 { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); //這行代碼的寫法基本上是不變的。它的做用是把當前程序集的特定類或接口註冊到依賴注入容器中。 } }
ABP框架會掃描全部的程序集,而且發現AbpModule類中全部已經導入的全部類,若是你已經建立了包含多個程序集的應用,對於ABP,咱們的建議是爲每個程序集建立一個Module(模塊)。
在一個應用中,abp框架調用了Module模塊的一些指定的方法來進行啓動和關閉模塊的操做。咱們能夠重載這些方法來完成咱們本身的任務。
ABP框架經過依賴關係的順序來調用這些方法,假如:模塊A依賴於模塊B,那麼模塊B要在模塊A以前初始化,模塊啓動的方法順序以下:
下面是具體方法的說明:
預初始化:當應用啓動後,第一次會調用這個方法。在依賴注入註冊以前,你能夠在這個方法中指定本身的特別代碼。舉個例子吧:假如你建立了一個傳統的登記類,那麼你要先註冊這個類(使用IocManager對登記類進行註冊),你能夠註冊事件到IOC容器。等。
初始化:在這個方法中通常是來進行依賴注入的註冊,通常咱們經過IocManager.RegisterAssemblyByConvention這個方法來實現。若是你想實現自定義的依賴注入,那麼請參考依賴注入的相關文檔。
提交初始化:最後一個方法,這個方法用來解析依賴關係。
關閉:當應用關閉之後,這個方法被調用。
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這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目能夠發展得更好。
歡迎加QQ羣:
ABP架構設計交流羣:134710707 ABP架構設計交流2羣: 579765441