ABP源码分析四:Configuration

核心模块的配置html

Configuration是ABP中设计比较巧妙的地方。其经过AbpStartupConfiguration,Castle的依赖注入,Dictionary对象和扩展方法很巧妙的实现了配置中心化。配置中心化是一个支持模块开发的框架必备功能。app

 

ABP中核心功能模块中的一些功能的运行时的行为是依赖于一些外部配置的。这一点应该不难理解。 简单解释下,好比Localization这个功能模块,最基本Abp须要知道要作哪些语言的本地化。而这些具体的配置对于Abp底层框架来讲是不可预知的,那么ABP底层框架就颇有必要提供一种手段供外部模块自定义Congfiguration. 这就是下文要分析的IAbpStartupConfiguration和他的小伙伴们(各类I***Configuration)。 下图描述了这些Configuration之间的关系(稍后解释)。框架

(图一)源码分析

 

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

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

(图二)3d

 

(图三)htm

 

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

 (图四)blog

 

至此,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源码分析系列文章目录

相关文章
相关标签/搜索