【ABP框架系列学习】模块系统(4)

 

0.引言

ABP提供了构建模块和通过组合模块以创建应用程序的基础设施。一个模块可以依赖于另外一个模块。通常,程序集可以认为是模块。如果创建多个程序集的应用程序,建议为每个程序集创建模块定义。

当前,模块系统主要集中在服务器,而不是客户端。

1.模块定义

模块是从ABP包中的AbpModule派生的类定义的。比如说开发一个可以用于不同应用程序的博客模块(Blog Module)。最简单的模块定义如下 :

复制代码
public class MyBlogApplicationModule : AbpModule {     public override void Initialize()     {         IocManager.RegisterAssemblyByConvention(Assembly.GetExecutingAssembly());     } }
复制代码

模块定义类负责通过依赖注入注册类,如有必要(可以像上述事例按惯例完成)。它还可以配置应用程序和其它模块,给应用程序增加新的功能等等。

2.生命周期方法

ABP在程序启动和关闭时调用模块一些特定的方法。你可以重写这些方法以执行某些特定的任务。

ABP按照依赖顺序调用这些方法。如果模块A依赖模块B,那么模块B在模块A之前初始化。

启动方法执行准确的顺序:PreInitialize-B, PreInitialize-A, Initialize-B, Initialize-A, PostInitialize-B, PostInitialize-A。对于所有依赖关系图都是如此。关闭方法也是类似的,但顺序相反。

相关源码:模块启动时依次执行PreInitialize()、Initialize()、PostInitialize(),模块关闭时首先Reverse()、然后在逐个模块Shutdown()。

复制代码
        public virtual void StartModules()         {             var sortedModules = _modules.GetSortedModuleListByDependency();             sortedModules.ForEach(module => module.Instance.PreInitialize());             sortedModules.ForEach(module => module.Instance.Initialize());             sortedModules.ForEach(module => module.Instance.PostInitialize());         }          public virtual void ShutdownModules()         {             Logger.Debug("Shutting down has been started");              var sortedModules = _modules.GetSortedModuleListByDependency();             sortedModules.Reverse();             sortedModules.ForEach(sm => sm.Instance.Shutdown());              Logger.Debug("Shutting down completed.");         }
复制代码

PreInitialize

当应用程序启动时,首先调用该方法。它是框架和其它模块初始化之前配置它们的首选方法。

你还可以在该方法中编写特定的代码,以便在依赖注入注册之前运行。例如,如果你创建一个传统的注册类,那么你应在该方法中使用IOCManager.AddConventionalRegisterer方法注册它们。

Initialize

该方法是依赖注入注册的地方,通过使用IocManager.RegisterAssemblyByConvention方法完成注册。如果想定义自定义的依赖注册,请见后续依赖注入章节。

PostInitialize

该方法在程序启动的最后调用。在这里解析依赖是安全的。

Shutdown

该方法在程序关闭时调用。

3.模块依赖(Module Dependencies)

一个模块可以依赖于另外的模块。你可以通过DependsOn特性显示声明依赖项,如下代码:

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信