簡介 ASP.NET Boilerplate提供了構建模塊的基礎結構,並將它們組合在一起以創建應用程式。 模塊可以依賴於另一個模塊。 通常,一個程式集被視為一個模塊。 如果創建具有多個程式集的應用程式,建議您為每個程式集創建一個模塊定義。 模塊系統目前專註於服務端,而不是客戶端。 模塊定義 定義一個 ...
簡介
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時才可以這樣做。
模塊配置
雖然可以使用自定義模塊方法配置模塊,但我們建議您使用啟動配置系統來定義和設置模塊的配置。
模塊聲明周期
模塊類被自動註冊為單例模式。