本文主要介绍了ASP.NET样板项目开发框架(ASP.NET Boilerplate Project)的模块系统
ABP框架即为ASP.NET Boilerplate Project(ASP.NET样板项目)的简称。项目框架的出发点就是在于让每一个工程师都能有架构师的思维,将一些通用而且相似的结构进行最佳实践。在第一篇中主要介绍了ABP框架所用的技术栈和大致分层,本次主要介绍模块系统。
ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另外一个模块,在通常的情况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,这个类要继承AbpMoudle。下面是一个最简单的模块定义:
public class MyBlogApplicationModule : AbpModule { public override void Initialize() { IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly()); } }
ABP框架会扫描所有的程序集,并且发现AbpModule类中所有已经导入的类,对于ABP项目来说,一般一个程序集创建一个模块(Module)。
生命周期
定义了这些Abp模块后,这些模块有统一的生命周期事件。在启用和关闭的时候会调用一些特定的模块方法。我们可以重写这些方法来执行对应的任务。
ABP框架通过依赖关系的顺序来调用这些方法,假如:模块A依赖于模块B,那么模块B要在模块A之前初始化,模块启动的方法顺序如下:
-
PreInitialize-B
-
PreInitialize-A
-
Initialize-B
-
Initialize-A
-
PostInitialize-B
-
PostInitialize-A
下面是具体的方法说明:
PreInitialize
预初始化:当应用启动后,第一次会调用这个方法。在依赖注入注册之前,你可以在这个方法中指定自己的特别代码。举个例子吧:假如你创建了一个传统的登记类,那么你要先注册这个类(使用IocManager对登记类进行注册),你可以注册事件到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之前进行初始化。
自定义模块方法
我们自己定义的模块中可能有方法被其他依赖于当前模块的模块调用,下面的例子,假设模块2依赖于模块1,并且想在预初始化的时候调用模块1的方法。
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(); //调用MyModuleMethod1的方法。
}
public override void Initialize()
{
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}
就这样,就把模块1注入到了模块2,因此,模块2就能调用模块1的方法了。转自http://www.learnfuture.com/article/1990