【转】ABP源码分析七:Setting 以及 Mail
本文主要說(shuō)明Setting的實(shí)現(xiàn)以及Mail這個(gè)功能模塊如何使用Setting.
?
首先區(qū)分一下ABP中的Setting和Configuration。
Setting一般用于需要通過外部配置文件(或數(shù)據(jù)庫(kù))設(shè)置的簡(jiǎn)單類型數(shù)據(jù)(一般就是字符串),比如SMTP HOST.
Configuration一般只需要通過內(nèi)部代碼完成的配置,一般用于設(shè)置復(fù)雜類型的數(shù)據(jù)。
?
目前Abp在setting 這個(gè)功能模塊只能從配置文件讀取設(shè)置,無(wú)法從其他source(比如數(shù)據(jù)庫(kù))讀取設(shè)置。也可以自定義SettingStore然后注入到ABP中來(lái)實(shí)現(xiàn)從其他Source讀取設(shè)置(非本文重點(diǎn))。
?
Setting如何實(shí)現(xiàn)的:
首先我們要定義一個(gè)Setting,也就是說(shuō)我們需要設(shè)置什么? 這個(gè)就是SettingDefinition。,?
SettingDefinition/SettingDefinitionGroup,?用于定義Setting。不同的Name標(biāo)識(shí)不同的Setting。假如要配置SMTP HOST,那么就可以定義一個(gè)name="Abp.Net.Mail.Smtp.Host" 的SettingDefinition。注意:?Name和DefaultValue必須要的屬性,其他都是輔助屬性。SettingDefinitionGroup用于給SettingDefinition分組,Abp底層框架似乎沒有真正使用過這個(gè)類。
下面這個(gè)圖說(shuō)明SettingDefinition/SettingDefinitionGroup定義了哪些屬性及他們的關(guān)系。
?
?
SettingScopes:這是一個(gè)標(biāo)注了Flags特性的枚舉類型,表示setting的應(yīng)用范圍。
?
SettingDefinitionProviderContext:上下文類,一般用于封裝方法間調(diào)用需要傳遞的參數(shù)。目前來(lái)說(shuō)只是個(gè)空類,沒有實(shí)際作用。
?
SettingProvider: 為具體的功能模塊所需的設(shè)置定義SettingDefinition,并且以數(shù)組的形式返回。使用SettingProvider定義SettingDefinition的是準(zhǔn)確方式。 那么Setting定義好以后,如何為其設(shè)置實(shí)際需要的value呢?目前可以在從web.config中設(shè)置。目前有EmailSettingProvider用于提供SMTP的設(shè)置,NotificationSettingProvider,LocalizationSettingProvider,還有ClearCacheSettingProvider。
?
SettingsConfiguration?/ISettingsConfiguration:用于集中化設(shè)置和管理SettingProvider的對(duì)象。其封裝了一個(gè)ITypeList<SettingProvider> Providers的集合類。實(shí)際項(xiàng)目中可以通過Configuration.Setting來(lái)獲取ISettingsConfiguration實(shí)例,然后將自定義的SettingProvider添加到SettingsConfiguration 對(duì)象中(需要在模塊的PreInitialize方法完成這個(gè)動(dòng)作)。
?
?
ISettingDefinitionManager/SettingDefinitionManager: 主要完成注冊(cè)到ABP中的SettingDefinition初始化。 首先通過ISettingsConfiguration實(shí)例獲取setting providers集合,然后在Initialize方法中通過setting providers獲取SettingDefinition的數(shù)組。并將其保存在Dictionary中,其key就是SettingDefinition的name.
?
ISettingDefinitionManager的Initialize方法是在AbpKernelModule的PostInitialize方法執(zhí)行的時(shí)候被調(diào)用。
?
上面接口/類直接的關(guān)系圖
?
上面解釋了ABP是如何定義/管理一個(gè)Setting. 下面解釋下ABP是如何使用Setting的。
?
ISettingValue/SettingValueObject:代表setting的鍵值對(duì)。Setting的具體值當(dāng)然在外部Config中,然而在代碼中是通過ISettingValue來(lái)封裝的。
?
SettingManager:通過ISettingStore獲取或更改Setting的值,SettingManager并不是每次調(diào)用ISettingStore去讀取設(shè)置,而是在第一讀取的時(shí)候就將結(jié)果緩存起來(lái)。如下代碼所示
定義緩存對(duì)象
?
讀入緩存
?
SettingInfo:封裝了應(yīng)用于user/tenant的setting值
ISettingStore:這個(gè)接口定義了相關(guān)方法用于從數(shù)據(jù)源讀取和更改setting值。 這些方法以SettingInfo類型作為方法的輸入和輸出參數(shù)。
DefaultConfigSettingStore:ABP中唯一實(shí)現(xiàn)了ISettingStore的類,只用于從配置文件讀取setting,修改是不支持的。ABP.Zero中有另外一個(gè)支持CRUD的實(shí)現(xiàn)。
下圖是上面接口及類的關(guān)系圖
?
?
?
下面以Mail功能的實(shí)現(xiàn)來(lái)說(shuō)明如何使用Setting
?
EmailSettingNames/Smtp:?封裝SMTP設(shè)置的信息。也就是說(shuō)定義了一些常量用作setting的name. 比如Host就是“Abp.Net.Mail.Smtp.Host”,所以在web.config就要配置一項(xiàng)key是“Abp.Net.Mail.Smtp.Host”的配置項(xiàng)。
?
EmailSettingProvider:繼承自SettingProvider, 將SMTP的各項(xiàng)設(shè)置封裝成SettingDefinition,并以數(shù)組形式返回。
?
ISmtpEmailSenderConfiguration/IEmailSenderConfiguration:定義了獲取EmailSettingNames中定義的設(shè)置的接口。
?
EmailSenderConfiguration/SmtpEmailSenderConfiguration:?實(shí)現(xiàn)上面兩個(gè)接口,通過IsettingManager的實(shí)例讀取設(shè)置
?
IEmailSender/ISmtpEmailSender/EmailSenderBase/SmtpEmailSender:?用于發(fā)送郵件。
?
最后,照舊圖示他們之間的關(guān)系。
?
返回ABP源碼分析系列文章目錄
Q:一個(gè)設(shè)置配置,怎么搞的這么復(fù)雜。。
A:我想這應(yīng)該是設(shè)計(jì)中嚴(yán)格遵循單一職責(zé)原則的必然結(jié)果:大量細(xì)小的類和看似復(fù)雜的關(guān)系。
Q:請(qǐng)問樓主最后的代碼圖是怎么生成的呢,插件還是vs自帶的
A:VS 自帶的,企業(yè)版和旗艦版有
SettingDefinitionProviderContext 提供上下文,可以通過上下文修改框架設(shè)定或自定義模塊的設(shè)定
例如:
public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context)
{
context.Manager.GetSettingDefinition(LocalizationSettingNames.DefaultLanguage).DefaultValue = “zh-cn”;
}
總結(jié)
以上是生活随笔為你收集整理的【转】ABP源码分析七:Setting 以及 Mail的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 日本“千年一遇美少女”桥本环奈主演恐怖片
- 下一篇: 腾讯良心软件QQ影音下线 推荐恒星播放器