ABP之模組系統

yixuan.han發表於2018-08-17

簡介

ASP.NET Boilerplate提供了構建模組的基礎結構,並將它們組合在一起以建立應用程式。 模組可以依賴於另一個模組。 通常,一個程式集被視為一個模組。 如果建立具有多個程式集的應用程式,建議您為每個程式集建立一個模組定義。

模組系統目前專注於服務端,而不是客戶端。

模組定義

定義一個派生自ABP包中的AbpModule的類作為一個模組。假設我們現在正在開發一個可以在不同應用程式中使用的Blog模組。最簡單的模組定義如下:

public class MyBlogApplicationModule : AbpModule
{
    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }
}

如果需要,模組定義類負責通過依賴注入(DI)來註冊它的類(它可以按常規方式完成,如上所示)。 它還可以配置應用程式和其他模組,為應用程式新增新功能等等……

生命週期方法

ABP在應用程式啟動和關閉時呼叫某些特定的模組方法。我們可以覆蓋這些方法去執行特定的任務。ABP按照依賴順序來呼叫這些方法。如果模組A依賴於模組B,模組B就在模組A之前初始化。

啟動方法的正確順序:PreInitialize-B,PreInitialize-A,Initialize-B,Initialize-A,PostInitialize-B和PostInitialize-A。 所有依賴圖都是如此。 關閉方法也類似,但順序相反。

預初始化(PreInitialize)

當應用程式啟動時,首先呼叫此方法。它是在初始化之前配置框架和其他模組要執行的方法。

我們也可以在這裡編寫一些特定的程式碼,然後在依賴注入註冊之前執行。例如,如果是建立傳統的註冊類,則應使用IocManager.AddConventionalRegisterer方法在此處註冊。

初始化(Initialize)

這是應該完成依賴注入註冊的地方,它通常使用IocManager.RegisterAssemblyByConvention方法完成。也可以自定義依賴注入註冊,到時請參閱依賴注入文件(後續寫了會加連結)。

初始化後(PostInitialize)

此方法在啟動過程中最後呼叫。 在這裡解決依賴是安全的。

關閉(Shutdown)

應用程式關閉時呼叫此方法。

模組依賴

模組可以依賴於另一個模組。 我們需要使用DependsOn屬性顯式宣告依賴項,如下所示:

[DependsOn(typeof(MyBlogCoreModule))]
public class MyBlogApplicationModule : AbpModule
{
    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }
}

在這裡,我們宣告MyBlogApplicationModule依賴於MyBlogCoreModule,並且MyBlogCoreModule應在MyBlogApplicationModule之前初始化。

ABP可以從啟動模組開始遞迴地解析依賴關係並相應地初始化它們,啟動模組初始化為最後一個模組。

外掛模組(PlugIn Modules)

雖然從啟動模組開始通過依賴項調查模組,但ANP也可以動態載入模組,AbpBootstrapper類定義了PlugInSources屬性,該屬性可用於新增資源以動態載入外掛模組。外掛源可以是實現IPlugInSource介面的任何類, PlugInFolderSource類實現從資料夾中的程式集獲取外掛模組。

ASP.NET Core

ABP ASP.NET Core在AddAbp擴充套件方法中定義選項,就是為了實現在Startup類中新增外掛源。

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.Add(new FolderPlugInSource(@"C:MyPlugIns"));
});

我們也可以呼叫AddFolder來實現最簡單的語法。

services.AddAbp<MyStartupModule>(options =>
{
    options.PlugInSources.AddFolder(@"C:MyPlugIns");
});

ASP.NET MVC, Web API

對於傳統的ASP.NET MVC應用程式,我們可以通過覆蓋global.asax中的Application_Start來新增外掛資料夾,如下所示:

public class MvcApplication : AbpWebApplication<MyStartupModule>
{
    protected override void Application_Start(object sender, EventArgs e)
    {
        AbpBootstrapper.PlugInSources.AddFolder(@"C:MyPlugIns");
        //...
        base.Application_Start(sender, e);
    }
}

PlugIns中的控制器

如果你的模組包含MVC或Web API控制器,則ASP.NET無法識別你的控制器。 要解決此問題,可以更改global.asax檔案,如下所示:

using System.Web;
using Abp.PlugIns;
using Abp.Web;
using MyDemoApp.Web;

[assembly: PreApplicationStartMethod(typeof(PreStarter), "Start")]

namespace MyDemoApp.Web
{
    public class MvcApplication : AbpWebApplication<MyStartupModule>
    {
    }

    public static class PreStarter
    {
        public static void Start()
        {
            //...
            MvcApplication.AbpBootstrapper.PlugInSources.AddFolder(@"C:MyPlugIns");
            MvcApplication.AbpBootstrapper.PlugInSources.AddToBuildManager();
        }
    }
}

附加元件

 IAssemblyFinder和ITypeFinder的預設實現(用於ABP識別應用程式中的特定類)僅時在這些程式集中查詢模組程式集和型別。 我們可以覆蓋模組中的GetAdditionalAssemblies方法來包含其他程式集。

自定義模組

模組中也可以有一些被其他依賴模組所使用的自定義方法。 假設MyModule2依賴於MyModule1並想要在PreInitialize方法中呼叫MyModule1的方法:

public class MyModule1 : AbpModule
{
    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }

    public void MyModuleMethod1()
    {
        //this is a custom method of this module
    }
}

[DependsOn(typeof(MyModule1))]
public class MyModule2 : AbpModule
{
    private readonly MyModule1 _myModule1;

    public MyModule2(MyModule1 myModule1)
    {
        _myModule1 = myModule1;
    }

    public override void PreInitialize()
    {
        _myModule1.MyModuleMethod1(); //Call MyModule1`s method
    }

    public override void Initialize()
    {
        IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
    }
}

這裡我們將建構函式注入MyModule1到MyModule2,因此MyModule2可以呼叫MyModule1的自定義方法。 僅當Module2依賴於Module1時才可以這樣做。

模組配置

雖然可以使用自定義模組方法配置模組,但我們建議您使用啟動配置系統來定義和設定模組的配置。

模組宣告週期
模組類被自動註冊為單例模式。

相關文章