ABP源码分析三:ABP Module

Posted HK Zhang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ABP源码分析三:ABP Module相关的知识,希望对你有一定的参考价值。

Abp是一种基于支持模块化设计的思想构建的。具体的功能都可以设计成一个单独的Module。Abp底层框架提供便捷的方法集成每个Module.下图是所有Abp自带的module.AbpModule是所有Module的基类,其已经拥有了IIocManager和IAbpStartupConfiguration的受保护的成员,从其派生的Module都可以直接获取并使用相关的功能。:

技术分享

 

以下以AbpWebMvcModule为例,这个就是Abp自定义的一个模块,该模块继承自AbpModule。 那么这个模块是怎么和Abp底层框架集成到一块的呢?


所谓集成可以从两个角度开看:

第一,Abp底层框架是如何发现这个Module的?

第二,这个Module是如何把自己的组件注册到Abp底层框架中的(AbpWebMvcModule中就是如何把Controller注册到Abp底层框架的容器中)?


先分析第二个问题: 如下代码中AbpWebMvcModule类中的PreInitialize 和 Initialize 很好的回答了这个问题。在PreInitialize中Abp调用IocManager的AddConventionalRegistrar方法以实例化的ControllerConventionalRegistrar为参数。上一篇已介绍过ControllerConventionalRegistrar的用处,这个类的实例在执行RejisterAssembly时会是将继承至controller的类型都注入到Abp底层框架中(也就是时IocManager里)。 Initialize这注册了一个Castle的WindsorControllerFactory以替换MVC下默认的ControllerFactory。


AddConventionalRegistrar方法向IocManager的一个私有泛型集合List<IConventionalDependencyRegistrar>注册注册机制,通常所有的Module类的预初始化方法中调用以决定哪些类型需要被注册(如果没有就无需调用)

技术分享

 

现在在看回第一个问题:Abp底层框架是如何发现这个Module的?

解释这个问题前向解释一下Module的描述信息是如何被封装的。AbpModuleInfo用于封装AbpModule的基本信息。 AbpModuleCollection则是AbpModuleInfo的集合。

技术分享

 

Abp底层框架发现Module是从AbpBootstrapper在执行Initialize方法的时候开始的,该方法会调用IAbpModuleManagerInitializeModules方法,该方法接着调用DefaultModuleFinderFindAll方法(该方法用于过滤出AbpModuleassembly),而FindAll方法调用TypeFinder得到所有的assembly. 所以只要你定义的assembly中有一个继承至AbpModule的类,并且该assembly被引用到你的项目中,那么这个Module就可以说会被Abp底层框架集成了。

具体关系如下图。

技术分享

 

AbpModuleManager得到所有的AbpModuleAbpModuleInfo以后,逐个调用这些ModulePreInitializeInitializePostInitialize以完成初始化。至此,AbpWebMvcModule算是完成了和Abp底层框架的集成了。值得一提的是所有AbpModule的关闭销毁也是通过AbpModuleManager调用ShutdownModules来遍历执行AbpModuleShutdown来实现的。

技术分享

 

上面解释了关于自定义的模块的注册和初始化,那么Abp底层框架的一些功能模块的类型的注册如何实现的呢? 通过AbpKernelModule来实现的,该类会调用如下图中的各种Register完成初始化(拦截器的注入)。以后的文章会逐个解释这些功能模块。

技术分享

 

技术分享

 

技术分享

以上是关于ABP源码分析三:ABP Module的主要内容,如果未能解决你的问题,请参考以下文章

[Abp 源码分析]依赖注入

ABP源码分析五:ABP初始化过程

ABP源码分析四十六:ABP ZERO中的Ldap模块

ABP源码分析十三:缓存Cache实现

[Abp 源码分析]ASP.NET Core 集成

ABP源码分析四十七:ABP中的异常处理