本篇目錄
模塊介紹###
ABP提供了構建模塊並將這些模塊組合起來創建應用的基礎設施。一個模塊可以依賴另一個模塊。一般來說,一個程序集可以認為是一個模塊。一個模塊是由一個派生了AbpModule的類定義的。比如說我們在開發一個可以用在不同的應用中的博客模塊。最簡單的模塊定義如下:
public class MyBlogApplicationModule : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}
ABP掃描所有的程序集,並找出所有的派生自AbpModule基類的類。如果你創建了不止一個程序集的應用,那么建議為每個程序集創建一個模塊定義。
生命周期事件###
ABP在應用啟動和關閉的時候會調用一些特定的模塊方法。你可以重寫這些方法來執行特定的任務。
ABP按照依賴的順序調用這些方法。如果模塊A依賴於模塊B,那么模塊B在模塊A之前初始化。方法執行的正確順序是:PreInitialize-B, PreInitialize-A, Initialize-B, Initialize-A, PostInitialize-B and PostInitialize-A。這對於所有的依賴圖都是成立的。Shutdown方法也是類似的,但順序相反。
PreInitialize
該方法會在應用啟動時首先調用。你可以在該方法里面寫一些特定的代碼,這些代碼會在依賴注入注冊之前執行。比如,如果你創建了一個傳統的注冊類,那么你應該把它在這里注冊(使用locManager.AddConventionalRegister方法)。你也可以注冊到IOC容器的事件...等等。
Initialize
該方法通常是依賴注入注冊的地方。一般使用IocManager.RegisterAssemblyByConvention方法完成。如果你想要定義自定義的依賴注冊,請看后面的依賴注入文檔。
PostInitialize
該方法在應用啟動的最后調用。在這里可以安全地解析一個依賴。
Shutdown
該方法在應用關閉的時候調用。
模塊依賴###
一個模塊可以獨立於另一個模塊。ABP會自動地嘗試解析這些依賴,但是建議通過重寫GetDependencies方法來顯式聲明依賴,正如下面那樣:
[DependsOn(typeof(MyBlogCoreModule))]
public class MyBlogApplicationModule : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}
這樣,我們聲明ABP:MyBlogApplicationModule依賴於MyBlogCoreModule,因而該核心模塊MyBlogCoreModule會在應用模塊MyBlogApplicationModule之前進行初始化。
自定義模塊方法###
你的模塊也可以有一些自定義的方法,這些方法可以被依賴於該模塊的其他模塊所使用。假設MyModule2依賴於MyModule1,且MyModule2想要在PreInitialize事件中調用一個MyModule1的方法。
public class MyModule1 : AbpModule
{
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
public void MyModuleMethod1()
{
//這是該模塊的自定義方法
}
}
[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());
}
}
這里,我們通過構造函數將MyModule1z注入到了MyModule2,因此MyModule2可以調用MyModule1的自定義方法。