【转】ABP源码分析七:Setting 以及 Mail
本文主要說明Setting的實現以及Mail這個功能模塊如何使用Setting.
?
首先區分一下ABP中的Setting和Configuration。
Setting一般用于需要通過外部配置文件(或數據庫)設置的簡單類型數據(一般就是字符串),比如SMTP HOST.
Configuration一般只需要通過內部代碼完成的配置,一般用于設置復雜類型的數據。
?
目前Abp在setting 這個功能模塊只能從配置文件讀取設置,無法從其他source(比如數據庫)讀取設置。也可以自定義SettingStore然后注入到ABP中來實現從其他Source讀取設置(非本文重點)。
?
Setting如何實現的:
首先我們要定義一個Setting,也就是說我們需要設置什么? 這個就是SettingDefinition。,?
SettingDefinition/SettingDefinitionGroup,?用于定義Setting。不同的Name標識不同的Setting。假如要配置SMTP HOST,那么就可以定義一個name="Abp.Net.Mail.Smtp.Host" 的SettingDefinition。注意:?Name和DefaultValue必須要的屬性,其他都是輔助屬性。SettingDefinitionGroup用于給SettingDefinition分組,Abp底層框架似乎沒有真正使用過這個類。
下面這個圖說明SettingDefinition/SettingDefinitionGroup定義了哪些屬性及他們的關系。
?
?
SettingScopes:這是一個標注了Flags特性的枚舉類型,表示setting的應用范圍。
?
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類型作為方法的輸入和輸出參數。
DefaultConfigSettingStore:ABP中唯一實現了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源碼分析系列文章目錄
Q:一個設置配置,怎么搞的這么復雜。。
A:我想這應該是設計中嚴格遵循單一職責原則的必然結果:大量細小的類和看似復雜的關系。
Q:請問樓主最后的代碼圖是怎么生成的呢,插件還是vs自帶的
A:VS 自帶的,企業版和旗艦版有
SettingDefinitionProviderContext 提供上下文,可以通過上下文修改框架設定或自定義模塊的設定
例如:
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
context.Manager.GetSettingDefinition(LocalizationSettingNames.DefaultLanguage).DefaultValue = “zh-cn”;
}
總結
以上是生活随笔為你收集整理的【转】ABP源码分析七:Setting 以及 Mail的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日本“千年一遇美少女”桥本环奈主演恐怖片
- 下一篇: 腾讯良心软件QQ影音下线 推荐恒星播放器