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。注意: NameDefaultValue必須要的屬性,其他都是輔助屬性。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類型作為方法的輸入和輸出參數。

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源碼分析系列文章目錄


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM