ABP理论学习之模块系统
2015-12-12 10:29
218 查看
返回总目录
生命周期事件
模块依赖
自定义模块方法
ABP扫描所有的程序集,并找出所有的派生自AbpModule基类的类。如果你创建了不止一个程序集的应用,那么建议为每个程序集创建一个模块定义。
ABP按照依赖的顺序调用这些方法。如果模块A依赖于模块B,那么模块B在模块A之前初始化。方法执行的正确顺序是:PreInitialize-B, PreInitialize-A, Initialize-B, Initialize-A, PostInitialize-B and PostInitialize-A。这对于所有的依赖图都是成立的。Shutdown方法也是类似的,但顺序相反。
这样,我们声明ABP:MyBlogApplicationModule依赖于MyBlogCoreModule,因而该核心模块MyBlogCoreModule会在应用模块MyBlogApplicationModule之前进行初始化。
这里,我们通过构造函数将MyModule1z注入到了MyModule2,因此MyModule2可以调用MyModule1的自定义方法。
本篇目录
模块介绍生命周期事件
模块依赖
自定义模块方法
模块介绍
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的自定义方法。
相关文章推荐
- SSH集成log4j日志环境[转]
- android布局ScrollView包含ListView
- Redis与Memcached的区别
- 叹息“博客园”的凋零
- hdu 1381
- 盘式制动系统卡钳分类
- Python-Matplotlib安装及简单使用
- Android获取手机和应用的相关信息
- JavaScript学习(5.7.3):"use strict"
- JDK错误
- LeetCode 241 Different Ways to Add Parentheses
- JDK错误
- 嵌入式Linux系统的电子书阅读器项目1——Overview
- 软件自动化测试概述
- JavaScript学习(5.7.2):debugger 语句
- 优秀网站/资源收藏/日常总结
- TCL脚本在Eclipse开发的环境搭建(图解)。
- GitHub上README.md教程
- 关于使用AFNetworking3.0.0报错的解决方案与建议
- 封装CoreData数据库