码迷,mamicode.com
首页 > 其他好文 > 详细

ABP源码分析三:ABP Module

时间:2016-03-16 16:44:01      阅读:172      评论:0      收藏:0      [点我收藏+]

标签:

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

标签:

原文地址:http://www.cnblogs.com/1zhk/p/5281458.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!