ABP模块系统简介
ABP框架提供了创建和组装模块的基础,一个模块能够依赖于另一个模块。在通常情况下,一个程序集就可以看成是一个模块。在ABP框架中,一个模块通过一个类来定义,而这个类要继承自AbpModule。
模块生命周期事件
在一个应用中,abp框架调用了Module模块的一些指定的方法来进行启动和关闭模块的操作。我们可以重载这些方法来完成我们自己的任务。
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:
关闭:当应用关闭以后,这个方法被调用。
示例:模块的运用
我们先定义一个模块程序集,然后在控制台应用中使用该模块
- 创建一个.net framework类库项目:MyModule1
- 通过Nuget引入ABP包
- 定义模块: 添加一个类MyModule1,继承自AbpModule
- 重写Initialize方法,把当前程序集的特定类或接口注册到依赖注入容器中
- 添加一个示例类TestClass,实现ITransientDependency接口
- 添加一个.Net Framework 控制台应用程序,并添加MyModule1项目的引用
- 在Main方法中创建并初始化AbpBootstrapper类的实例
- 初始化AbpBootstrapper类的实例
- 通过Ioc容器获取MyModule1模块中TestClass类的实例
- 使用模块中的类定义的方法
源码:
- MyModule1项目:
TestClass.cs:
using Abp.Dependency;
namespace MyModule1
{
public class TestClass : ITransientDependency
{
public string SayHello()
{
return "Hello,World!";
}
}
}
MyModule1.cs:
using Abp.Modules;
using System.Reflection;
namespace MyModule1
{
public class MyModule1 : AbpModule
{
/// <summary>
/// 模块初始化
/// </summary>
public override void Initialize()
{
//这行代码的写法基本上是不变的。
//它的作用是把当前程序集的特定类或接口注册到依赖注入容器中。
IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());
}
}
}
- ModuleTestConsole项目:
using Abp;
using Abp.Dependency;
using MyModule1;
using System;
namespace ModuleTestConsole
{
class Program
{
static void Main(string[] args)
{
//创建AbpBootstrapper实例
using (var bootstrapper = AbpBootstrapper.Create<MyModule1.MyModule1>())
{
//初始化AbpBootstrapper实例
bootstrapper.Initialize();
//通过Ioc容器获取MyModule1模块中TestClass类的实例
using (var tester = bootstrapper.IocManager.ResolveAsDisposable<TestClass>())
{
//使用模块中的类定义的方法
var result = tester.Object.SayHello();
Console.WriteLine(result);
} //Disposes tester and all it's dependencies
Console.WriteLine("Press enter to exit...");
Console.ReadLine();
}
}
}
}
模块依赖
Abp框架会自动解析模块之间的依赖关系,但是我们还是建议你通过重载GetDependencies方法来明确的声明依赖关系。
这个可以参考官方示例项目:AbpEfConsoleApp
在这个项目里面,定义了一个MyConsoleAppModule模块,它依赖于AbpEntityFrameworkModule,这里通过特性(Attribute)声明了依赖关系