Abp是一种基于模块化设计的思想构建的。开发人员能够将自定义的功能以模块(module)的形式集成到ABP中。具体的功能均可以设计成一个单独的Module。Abp底层框架提供便捷的方法集成每一个Module.下图是全部Abp自带的module.AbpModule是全部Module的基类,其已经拥有了IIocManager和IAbpStartupConfiguration的受保护的成员,从其派生的Module均可以直接获取并使用相关的功能(依赖注入,Configuration)。:html
如下以AbpWebMvcModule为例,这个就是Abp自定义的一个模块,该模块继承自AbpModule。 那么这个模块是怎么和Abp底层框架集成到一块的呢?app
所谓集成能够从两个角度开看: 框架
第一,Abp底层框架是如何发现这个Module的? 模块化
第二,这个Module是如何把本身的组件(类,接口)注册到Abp底层框架中(AbpWebMvcModule中,这问题就演变为如何把Controller注册到Abp底层框架的容器中)?源码分析
先分析第二个问题: 以下代码中AbpWebMvcModule类中的PreInitialize 和 Initialize 很好的回答了这个问题。在PreInitialize中Abp调用IocManager的AddConventionalRegistrar方法以实例化的ControllerConventionalRegistrar为参数。上一篇已介绍过ControllerConventionalRegistrar的用处,这个类的实例在执行RejisterAssembly时会是将继承至controller的类型都注入到Abp底层框架中(也就是Castle容器中)。 Initialize这注册了一个Castle的WindsorControllerFactory以替换MVC下默认的ControllerFactory,这样ASP.NET MVC将使用WindsorControllerFactory从Castle容器中解析出controller.spa
AddConventionalRegistrar方法向IocManager的一个私有泛型集合List<IConventionalDependencyRegistrar>注册注册机制,一般全部的Module类的预初始化方法中调用以决定哪些类型须要被注册(若是没有就无需调用)设计
如今在看回第一个问题:Abp底层框架是如何发现这个Module的?3d
解释这个问题前,有必要解释一下Module的描述信息是如何被封装的。AbpModuleInfo用于封装AbpModule的基本信息。 AbpModuleCollection则是AbpModuleInfo的集合。htm
Abp底层框架发现Module是从AbpBootstrapper在执行Initialize方法的时候开始的,该方法会调用IAbpModuleManager实例的InitializeModules方法,这个方法接着调用DefaultModuleFinder的FindAll方法(该方法用于过滤出AbpModule的assembly),而FindAll方法调用TypeFinder获得全部的assembly. 因此只要你定义的assembly中有一个继承至AbpModule的类,而且该assembly被引用到你的项目中,那么这个Module就能够说会被Abp底层框架集成了。blog
具体关系以下图。
AbpModuleManager获得全部的AbpModule的AbpModuleInfo之后,逐个调用这些Module的PreInitialize,Initialize和PostInitialize以完成初始化。(注意,ABP先完成全部Module的PreInitialize,接着再执行全部Module的Initialize,最后执行PostInitialize。不是执行完一个Module的这三个方法,再去执行下一个Module的这三个方法。这个很好理解,若是是后者的话,咱们只要一个Initialize方法就能够了,全部的方法都放入这个Initialize方法中便可。)至此,AbpWebMvcModule算是完成了和Abp底层框架的集成了。值得一提的是全部AbpModule的关闭销毁也是经过AbpModuleManager调用ShutdownModules来遍历执行AbpModule的Shutdown来实现的。
上面解释了关于自定义的模块的注册和初始化,那么Abp底层框架的一些功能模块的类型的注册如何实现的呢? 经过AbpKernelModule来实现的,该类会调用以下图中的各类Register完成初始化(拦截器的注入)。之后的文章会逐个解释这些功能模块。