文檔目錄 本節內容: 簡介 模塊定義 生命周期方法 PreInitialize(預初始化) Initialize(初始化) PostInitialize(提交初始化) Shutdown(關閉) 模塊依賴 插件模塊 Asp.net Core Asp.net Mvc,Web Api 插件中的控制器 附加 ...
本節內容:
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方法類似,不過順序是相反的。
應用啟動時最先調用這個方法,它通常在初始化前configure(配置)框架或是其它模塊。
同樣,你也可以在這裡寫一些特定的代碼運行在依賴註入註冊之前。例如,你想創建一個約定註冊(Conventional Registration)類,你應該在這裡使用IcoManager.AddConventionalRegisterer方法來註冊這個類。
依賴註入註冊一般都在這裡完成,一般都使用IcoManager.RegisterAssemblyByConvention方法。如果你想自定義依賴註冊,請查看dependency injection documentation.
在啟動過程中最後調用這個方法,此時可以安全的解析依賴。
當應用關閉時調用這個方法。
一個模塊可以依賴於其它模塊,它要求使用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應用里,我們可以重寫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)系統為模塊定義和設置配置。
模塊類自動地被註冊成單例。