ABP框架 - 模塊系統


文檔目錄

 

本節內容:

 

簡介

 ABP為創建模塊及組織它們提供基礎框架。一個模塊可依賴於另一個模塊。通常地,一個程序集做為一個模塊。如果你的應用是多個程序集,建議為每個程序集定義一個模塊。

模塊系統目前把焦點放在服務端上而不是客戶端。

 

模塊定義

一個模塊定義成一個繼承於AppModule類的類。 假設我們正在開發一個能用於不同應用的Blog模塊,最簡單的模塊定義可能像如下所示:

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

模塊定義類負責把自己的類注冊到依賴注入里(約定做法如上所示)、配置應用和其它模塊、為應用添加新的特性等...

 

生命周期方法

ABP在應用啟動和關閉時,為模塊調用一些特定的方法。你可以重寫這些方法來執行一些特定的任務。

ABP按依賴關系順序調用這些方法。如果模塊A依賴於模塊B,模塊B會在模塊A前初始化,確切的啟動方法順序是:預初始化B,預初始化A,初始化B,提交B和提交A。這就是依賴路線。Shutdown方法類似,不過順序是相反的。

 

PreInitialize(預初始化)

應用啟動時最先調用這個方法,它通常在初始化前configure(配置)框架或是其它模塊。

同樣,你也可以在這里寫一些特定的代碼運行在依賴注入注冊之前。例如,你想創建一個約定注冊(Conventional Registration)類,你應該在這里使用IcoManager.AddConventionalRegisterer方法來注冊這個類。

 

Initialize(初始化)

依賴注入注冊一般都在這里完成,一般都使用IcoManager.RegisterAssemblyByConvention方法。如果你想自定義依賴注冊,請查看dependency injection documentation.

 

PostInitialize(提交初始化)

在啟動過程中最后調用這個方法,此時可以安全的解析依賴。

 

Shutdown(關閉)

當應用關閉時調用這個方法。

 

模塊依賴

一個模塊可以依賴於其它模塊,它要求使用DenpendsOn特性顯式地聲明依賴關系,如下:

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

由於我們聲明MyBlogApplicationModule依賴於MyBlogCoreModule,所以MyBlogCoreModule會在MyBlogApplicationModule前初始化。

ABP可以從startup模塊解析依賴並按順序初始化它們。

 

插件模塊

盡管ABP解析是從startup模塊開始到所有依賴,但也可以動態加載模塊。AbpBootstrapper類定義PlugInSpurces屬性,該屬性用來就是用來添加源到動態加載插件模塊,一個插件源可以是任何實現了IPlugInSource接口的類,PlugInFolderSource類實現了這個接口,並指明在某個文件夾下的程序集里獲取一個插件模塊。

Asp.net Core

譯注:暫略

 

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);
    }
}

 

插件中的控制器

如果你的模塊包含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,想在預初始化時調用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的情況下可用。

 

模塊配置

盡管自定義模塊方法能配置模塊,但我們建議使用啟動配置(startup configuration)系統為模塊定義和設置配置。

 

模塊生命期

模塊類自動地被注冊成單例。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM