天天看點

ABP(現代ASP.NET樣闆開發架構)系列之4、ABP子產品系統

點這裡進入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之前初始化,子產品啟動的方法順序如下:

  1. PreInitialize-B
  2. PreInitialize-A
  3. Initialize-B
  4. Initialize-A
  5. PostInitialize-B
  6. 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這個項目,也許這其中有能幫助到您的地方,也許有您的參與,這個項目可以發展得更好。

歡迎加QQ群:

ABP架構設計交流群:134710707

ABP(現代ASP.NET樣闆開發架構)系列之4、ABP子產品系統

      ABP架構設計交流2群: 579765441

ABP(現代ASP.NET樣闆開發架構)系列之4、ABP子產品系統

繼續閱讀