核心模塊的配置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。