ABP之模塊系統

簡介

ASP.NET Boilerplate提供了構建模塊的基礎結構,並將它們組合在一塊兒以建立應用程序。 模塊能夠依賴於另外一個模塊。 一般,一個程序集被視爲一個模塊。 若是建立具備多個程序集的應用程序,建議您爲每一個程序集建立一個模塊定義。web

模塊系統目前專一於服務端,而不是客戶端。api

模塊定義

定義一個派生自ABP包中的AbpModule的類做爲一個模塊。假設咱們如今正在開發一個能夠在不一樣應用程序中使用的Blog模塊。最簡單的模塊定義以下:安全

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

若是須要,模塊定義類負責經過依賴注入(DI)來註冊它的類(它能夠按常規方式完成,如上所示)。 它還能夠配置應用程序和其餘模塊,爲應用程序添加新功能等等......mvc

生命週期方法

ABP在應用程序啓動和關閉時調用某些特定的模塊方法。咱們能夠覆蓋這些方法去執行特定的任務。ABP按照依賴順序來調用這些方法。若是模塊A依賴於模塊B,模塊B就在模塊A以前初始化。app

啓動方法的正確順序:PreInitialize-B,PreInitialize-A,Initialize-B,Initialize-A,PostInitialize-B和PostInitialize-A。 全部依賴圖都是如此。 關閉方法也相似,但順序相反。框架

預初始化(PreInitialize)ide

當應用程序啓動時,首先調用此方法。它是在初始化以前配置框架和其餘模塊要執行的方法。函數

咱們也能夠在這裏編寫一些特定的代碼,而後在依賴注入註冊以前執行。例如,若是是建立傳統的註冊類,則應使用IocManager.AddConventionalRegisterer方法在此處註冊。ui

初始化(Initialize)this

這是應該完成依賴注入註冊的地方,它一般使用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時才能夠這樣作。

模塊配置

雖然可使用自定義模塊方法配置模塊,但咱們建議您使用啓動配置系統來定義和設置模塊的配置。

模塊聲明週期模塊類被自動註冊爲單例模式。

相關文章
相關標籤/搜索