首页 > 其他 > 详细

ABP源码分析四:Configuration

时间:2016-03-17 16:10:19      阅读:297      评论:0      收藏:0      [点我收藏+]

核心模块的配置

ABP中核心功能模块中的有些功能的具体行为是依赖于一些外部配置的(基本常识,凡是搭过框架的都懂得)。 稍微解释下,比如Localization这个功能模块吧,最基本要让Abp知道要做哪些语言的本地化吧。而这些具体的配置对于Abp底层框架来说是不可预先可知的,那么ABP底层框架就很有必要提供一种手段供外部模块自定义Congfiguration. 这就是下文要分析的IAbpStartupConfiguration和他的小伙伴们(各种I***Configuration)。 下图清楚的描述了这些Configuration之间的关系(稍后解释)。

技术分享

(图一)

 

上面图中的都是接口,我们还需要知道这些接口的实例对象是在哪里生成的呢?

这就要看回AbpBootstrapper的Initialize方法了(AbpBootstrapper在前面的文章已有介绍)。
首先,第一行通过AbpCoreInstaller注册的是系统框架级的所有configuration.
接着通过容器生成IAbpStartupConfiguration的实例AbpStartupConfiguration对象。
最后调用AbpStartupConfiguration的Initialize方法,该方法最终调用容器生成他的小伙伴的各种实例(****Configuration)。

技术分享

(图二)

 

技术分享

(图三)

 

ABP的作者为了方便管理,他把所有需要在ABP初始化阶段就要被实例化的接口都放到了Startup文件夹下(贴心啊!)。

技术分享

 (图四)

 

至此,ABP核心功能组件的Configuration就已经完成实例化了, 此后需要调用或修改某个组件的Configuration,只要引用其IAbpStartupConfiguration的实例Configuration即可访问各个组件的Configuration了。如下图AbpModule下的Configuration其实就是AbpStartupConfiguration,是一个单例。而Localization就是AbpStartupConfiguration实例的一个小伙伴LocalizationConfiguration。通过它就可以配置本地化了。同样的逻辑也适合其他****Configuration。

技术分享

 (图五)

 

 

自定义模块的配置

上面基本解释了Abp核心功能模块的配置的运作方式,接下来在分析下自定义module的Configuration 是如何实现的。下图描述了Abp中哪些原生Module会有自定义的configuration.

技术分享

 

Abp底层框架清楚有哪些核心功能模块,所以就很自然的给每个核心功能模块各自定义一个Configuration接口。但是Abp底层框架并不知道自定义的module有哪些,所以也就无法给每个自定义的module都创建一个Configuration接口。那么ABP底层框架是怎么保持每个自定义的module的Configuration的呢?

如果仔细观察图一的话,我们发现IAbpStartupConfiguration引用了一个IDictionaryBasedConfig的接口对象,IDictionaryBasedConfig的实现是DictionaryBasedConfig如下图。DictionaryBasedConfig下有个dictionary,这个就是最终保存自定义的module的Configuration的地方,因为Configuration的类型未知,所以dictionary的value是object类型。

技术分享

 

下面以AbpWebModule为例讲一下自定义的module是如何实现Configuration。
第一步, 如下图, AbpWebModule定义了自己的接口IAbpWebModuleConfiguration和AbpWebModuleConfiguration,以及AbpConfigurationExtension

技术分享

 

第二步, 如下图, 在AbpWebModule的preInitialize方法中将接口IAbpWebModuleConfiguration和其实现AbpWebModuleConfiguration注册到容器中。

技术分享

 

第三步, 如下图, 看下AbpConfigurationExtension的实现。这是一个扩展方法,扩展了IModuleConfigurations接口,这个接口是在Abp底层框架中定义和实现的。其属性AbpConfiguration就是AbpStartupConfiguration实例。通过AbpStartupConfiguration的getorCreate方法(具体通过DictionaryBasedConfig来实现)就可以获取到AbpWebModule自定义的AbpWebModuleConfiguration的实例了。

技术分享

 

具体访问方式如下,Configuration.Modules就是IModuleConfigurations的实例。通过其扩展方法AbpWeb访问AbpWebModuleConfiguration

Configuration.Modules.AbpWeb.SendAllExceptionsToClients=True;

 

最后这张图列出了AbpStartupConfiguration的所有可访问的configuration。

技术分享

ABP源码分析四:Configuration

原文:http://www.cnblogs.com/1zhk/p/5285623.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!