1. 程式人生 > >ABP原始碼分析四:Configuration

ABP原始碼分析四:Configuration

核心模組的配置

Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。

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

核心模組的配置 Configuration是ABP中設計比較巧妙的地方。其通過AbpStartupConfiguration,Castle的依賴注入,Dictionary物件和擴充套件方法很巧妙的實現了配置中心化。配置中心化是一個支援模組開發的框架必備功能。 ABP中核心功能模組中的一些功能的執行時的

ABP原始碼分析十三ZERO的本地化

ABP Zero模組擴充套件了ABP基礎框架中的本地化功能,實現了通過資料庫管理本地化的功能。其通過資料庫儲存本地化語言及其資源。 ApplicationLanguage:代表本地化語言的實體類。一種語言就是一個ApplicationLanguage例項。 ApplicationLanguag

ABP原始碼分析十二ZERO的身份認證

ABP Zero模組通過自定義實現Asp.Net Identity完成身份認證功能, 對Asp.Net Identity做了較大幅度的擴充套件。同時重寫了ABP核心模組中的permission功能,以實現授權。注意:ABP僅僅使用了Asp.Net Identity的身份認證功能,但沒有使用Asp.Net Id

ABP原始碼分析十一ZERO的Audit,Setting,Background Job

AuditLog: 繼承自Entity<long>的實體類。封裝AuditLog的資訊。 AuditingStore: 實現了IAuditingStore介面,實現了將AuditLog的資訊儲存到資料庫的功能。其通過IRepository<AuditLog, long>例項完成對資料

ABP原始碼分析ZERO的配置

ABP Zero模組中需要配置的地方主要集中在三塊:配置靜態的role,配置外部認證源,以及配置本地化語言和資源。 UserManagementConfig/IUserManagementConfig:定義了一個配置項,用於配置外部認證源。預設情況下,ABP Zero使用AbpUser表作為身份

ABP原始碼分析ZERO的Application和Tenant

ABP的Zero模組以資料庫為資料來源實現了ABP框架中的tenant management (multi-tenancy), role management, user management, session, authorization (permission management), setting m

ABP原始碼分析十七ABP中的異常處理

ABP 中異常處理的思路是很清晰的。一共五種型別的異常類。 AbpInitializationException用於封裝ABP初始化過程中出現的異常,只要丟擲AbpInitializationException異常就可以,無須做額外處理。這類異常往往是需要維護人員介入分析的。 其他四個異常都在AbpCon

WebRTC原始碼分析視訊模組結構

本文在上篇的基礎上介紹WebRTC視訊部分的模組結構,以進一步瞭解其實現框架,只有瞭解了整體框架結構,對區域性演算法修改才能夠胸有成竹。 一、對外介面        對外介面有ViEBase,ViECapture,ViECodec,ViEEncryption,V

Spring Security原始碼分析Spring Social實現微信社交登入

社交登入又稱作社會化登入(Social Login),是指網站的使用者可以使用騰訊QQ、人人網、開心網、新浪微博、搜狐微博、騰訊微博、淘寶、豆瓣、MSN、Google等社會化媒體賬號登入該網站。 前言 在上一章Spring-Security原始碼分析

ABP原始碼分析ABP Module

Abp是一種基於模組化設計的思想構建的。開發人員可以將自定義的功能以模組(module)的形式整合到ABP中。具體的功能都可以設計成一個單獨的Module。Abp底層框架提供便捷的方法整合每個Module.下圖是所有Abp自帶的module.AbpModule是所有Module的基類,其已經擁有了IIocMa

ABP原始碼分析整體專案結構及目錄

ABP是一套非常優秀的web應用程式架構,適合用來搭建集中式架構的web應用程式。 整個Abp的Infrastructure是以Abp這個package為核心模組(core)+15個模組(module).其中13個依賴於Abp這個核心包。另外兩個包(FluentMigration,Web.Resources

ABP原始碼分析ABP初始化全過程

ABP在初始化階段做了哪些操作,前面的四篇文章大致描述了一下。 為個更清楚的描述其脈絡,做了張流程圖以輔助說明。其中每一步都涉及很多細節,難以在一張圖中全部表現出來。每一步的細節(會涉及到較多介面,類,呼叫關係,步驟流程什麼的)會在後面的文章中通過其他圖和文字詳細描述。其實如果仔細分析Abp原始碼的話,會發現

ABP原始碼分析十三快取Cache實現

ABP中有兩種cache的實現方式:MemroyCache 和 RedisCache. 如下圖,兩者都繼承至ICache介面(準確說是CacheBase抽象類)。ABP核心模組封裝了MemroyCache 來實現ABP中的預設快取功能。 Abp.RedisCache這個模組封裝RedisCache來實現快取(

ABP原始碼分析Logger整合

ABP使用Castle日誌記錄工具,並且可以使用不同的日誌類庫,比如:Log4Net, NLog, Serilog... 等等。對於所有的日誌類庫,Castle提供了一個通用的介面來實現,我們可以很方便的處理各種特殊的日誌庫,而且當業務需要的時候,很容易替換日誌元件。 Logger功能模組涉及到的介面和類不

ABP原始碼分析ABP中配置的註冊和初始化

一般來說,ASP.NET Web應用程式的第一個執行的方法是Global.asax下定義的Start方法。執行這個方法前HttpApplication 例項必須存在,也就是說其建構函式的執行必然是完成了。 ABP開始的地方就是HttpApplication的建構函式。 如下圖一,Abp定義了一個繼承自Http

ABP原始碼分析依賴注入的實現

ABP的依賴注入的實現有一個本質兩個途徑:1.本質上是依賴於Castle這個老牌依賴注入的框架。2.一種實現途徑是通過實現IConventionalDependencyRegistrar的例項定義注入的約定(規則),然後通過IocManager來讀取這個規則完成依賴注入。3另一種實現途徑是直接IocManag

ABP原始碼分析Setting 以及 Mail

本文主要說明Setting的實現以及Mail這個功能模組如何使用Setting. 首先區分一下ABP中的Setting和Configuration。 Setting一般用於需要通過外部配置檔案(或資料庫)設定的簡單型別資料(一般就是字串),比如SMTP HOST. Configuration一般

ABP原始碼分析Unit Of Work

ABP以AOP的方式實現UnitOfWork功能。通過UnitOfWorkRegistrar將UnitOfWorkInterceptor在某個類被註冊到IOCContainner的時候,一併新增到該類在容器中對應的ComponentModel的Interceptors集合中。總結一句話就是,UOW的功能是通過

ABP原始碼分析後臺工作任務

文主要說明ABP中後臺工作者模組(BackgroundWorker)的實現方式,和後臺工作模組(BackgroundJob)。ABP通過BackgroundWorkerManager來管理BackgroundJobManager,然後通過BackgroundJobManager來管理BackgroundJob

ABP原始碼分析Entity的設計

IEntity<TPrimaryKey>: 封裝了PrimaryKey:Id,這是一個泛型型別 IEntity: 封裝了PrimaryKey:Id,這是一個int型別 Entity<TPrimaryKey> :支援主鍵是泛型型別的Entity Entity:支援主鍵是int型別的