ABP源碼分析七:Setting 以及 Mail

本文主要說明Setting的實現以及Mail這個功能模塊如何使用Setting. html

 

首先區分一下ABP中的Setting和Configuration。 web

Setting通常用於須要經過外部配置文件(或數據庫)設置的簡單類型數據(通常就是字符串),好比SMTP HOST.數據庫

Configuration通常只須要經過內部代碼完成的配置,通常用於設置複雜類型的數據。數組

 

目前Abp在setting 這個功能模塊只能從配置文件讀取設置,沒法從其餘source(好比數據庫)讀取設置。也能夠自定義SettingStore而後注入到ABP中來實現從其餘Source讀取設置(非本文重點)。緩存

 

Setting如何實現的:框架

首先咱們要定義一個Setting,也就是說咱們須要設置什麼? 這個就是SettingDefinition。, ide

SettingDefinition/SettingDefinitionGroup 用於定義Setting。不一樣的Name標識不一樣的Setting。假如要配置SMTP HOST,那麼就能夠定義一個name="Abp.Net.Mail.Smtp.Host" 的SettingDefinition。注意: NameDefaultValue必需要的屬性,其餘都是輔助屬性。SettingDefinitionGroup用於給SettingDefinition分組,Abp底層框架彷佛沒有真正使用過這個類。源碼分析

下面這個圖說明SettingDefinition/SettingDefinitionGroup定義了哪些屬性及他們的關係。spa

 

 

SettingScopes:這是一個標註了Flags特性的枚舉類型,表示setting的應用範圍。3d

 

SettingDefinitionProviderContext:上下文類,通常用於封裝方法間調用須要傳遞的參數。目前來講只是個空類,沒有實際做用。

 

SettingProvider: 爲具體的功能模塊所需的設置定義SettingDefinition,而且以數組的形式返回。使用SettingProvider定義SettingDefinition的是準確方式。 那麼Setting定義好之後,如何爲其設置實際須要的value呢?目前能夠在從web.config中設置。目前有EmailSettingProvider用於提供SMTP的設置,NotificationSettingProvider,LocalizationSettingProvider,還有ClearCacheSettingProvider。

 

SettingsConfiguration /ISettingsConfiguration:用於集中化設置和管理SettingProvider的對象。其封裝了一個ITypeList<SettingProvider> Providers的集合類。實際項目中能夠經過Configuration.Setting來獲取ISettingsConfiguration實例,而後將自定義的SettingProvider添加到SettingsConfiguration 對象中(須要在模塊的PreInitialize方法完成這個動做)。

 

 

ISettingDefinitionManager/SettingDefinitionManager: 主要完成註冊到ABP中的SettingDefinition初始化。 首先經過ISettingsConfiguration實例獲取setting providers集合,而後在Initialize方法中經過setting providers獲取SettingDefinition的數組。並將其保存在Dictionary中,其key就是SettingDefinition的name.

 

ISettingDefinitionManager的Initialize方法是在AbpKernelModule的PostInitialize方法執行的時候被調用。

 

上面接口/類直接的關係圖

 


上面解釋了ABP是如何定義/管理一個Setting. 下面解釋下ABP是如何使用Setting的。

 

ISettingValue/SettingValueObject:表明setting的鍵值對。Setting的具體值固然在外部Config中,然而在代碼中是經過ISettingValue來封裝的。

 

SettingManager:經過ISettingStore獲取或更改Setting的值,SettingManager並非每次調用ISettingStore去讀取設置,而是在第一讀取的時候就將結果緩存起來。以下代碼所示

定義緩存對象

 

讀入緩存

 

SettingInfo:封裝了應用於user/tenant的setting值


ISettingStore:這個接口定義了相關方法用於從數據源讀取和更改setting值。 這些方法以SettingInfo類型做爲方法的輸入和輸出參數。

DefaultConfigSettingStoreABP中惟一實現了ISettingStore的類,只用於從配置文件讀取setting,修改是不支持的。ABP.Zero中有另一個支持CRUD的實現。

下圖是上面接口及類的關係圖

 

 

 


下面以Mail功能的實現來講明如何使用Setting

 

EmailSettingNames/Smtp: 封裝SMTP設置的信息。也就是說定義了一些常量用做setting的name. 好比Host就是「Abp.Net.Mail.Smtp.Host」,因此在web.config就要配置一項key是「Abp.Net.Mail.Smtp.Host」的配置項。

 

EmailSettingProvider:繼承自SettingProvider, 將SMTP的各項設置封裝成SettingDefinition,並以數組形式返回

 

ISmtpEmailSenderConfiguration/IEmailSenderConfiguration:定義了獲取EmailSettingNames中定義的設置的接口。

 

EmailSenderConfiguration/SmtpEmailSenderConfiguration: 實現上面兩個接口,經過IsettingManager的實例讀取設置

 

IEmailSender/ISmtpEmailSender/EmailSenderBase/SmtpEmailSender: 用於發送郵件。

 

最後,照舊圖示他們之間的關係。

 

返回ABP源碼分析系列文章目錄

相關文章
相關標籤/搜索