日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】ABP源码分析七:Setting 以及 Mail

發布時間:2023/12/10 编程问答 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。