文檔目錄 本節內容: 簡介 關於ISettingStore 定義設置 setting scope(設置範圍) 重寫設置定義 獲取設置值 服務端 客戶端 修改設置 關於緩存 關於ISettingStore setting scope(設置範圍) 重寫設置定義 服務端 客戶端 簡介 每個應用必需存儲一些 ...
本節內容:
每個應用必需存儲一些設置,併在應用里的某處使用它。ABP提供一個強大的基礎來存儲/獲取應用、租戶和用戶級別的設置,服務端與客戶端都可以。
一個設置是一對name-value字元串,通常存儲在資料庫(或其它源)。我們可以把不是字元串類的值,轉換成字元串後存儲。
為使用設置系統,必須實現ISettingStore介面。雖然你能用自己的方式實現它,不過在module-zero項目里已經完全實現。如果不實現它,會從配置文件(web.config或app.config)中讀取設置,但不能修改設置。同樣,scope不能工作。
設置在用前需要先定義,ABP設計成模塊化。所以不同模塊可以有不同設置。一個模塊為定義它的設置,創建一個繼承自SettingProvider的類,如下是設置供應器示例代碼:
public class MySettingProvider : SettingProvider { public override IEnumerable<SettingDefinition> GetSettingDefinitions(SettingDefinitionProviderContext context) { return new[] { new SettingDefinition( "SmtpServerAddress", "127.0.0.1" ), new SettingDefinition( "PassiveUsersCanNotLogin", "true", scopes: SettingScopes.Application | SettingScopes.Tenant ), new SettingDefinition( "SiteColorPreference", "red", scopes: SettingScopes.User, isVisibleToClients: true ) }; } }
GetSettingDefinitions方法返回SettingDefinition對象集。SettingDefinition類的構造器有一些參數:
- Name(必需):一個設置必須有一個系統範圍內唯一的名稱,最好定義成一個常量,而不是可變的字元串。
- Default value:有一個預設值,可以是null或“”。
- Scope:一個設置應該有它的Scope(見下方)。
- Display name:一個顯示在UI上的本地化名稱字元串。
- Description:一個顯示在UI上的本地化描述字元串
- Group:只用在UI上,不在設置管理里使用,用來群組設置。
- IsVisibleToClients:設為true使客戶端上的設置可用。
- isInherited:這個設置是否被租戶和用戶繼承(見“設置 scope”)。
- customData:為這個定義設置一個用戶數據。
在創建一個設置供應器後,我們應該為我們的模塊,在預初始化方法里註冊它。
Configuration.Settings.Providers.Add<MySettingProvider>();
設置供應器會自動被依賴註入所註冊,所以一個設置供應器可以註入任何依賴(如一個倉儲),以用途其它源建立設置定義。
在SettingScopes枚舉里,有三個設置範圍(或級別):
- Application:一個應用範圍的設置,用在用戶/租戶的獨立設置。例如,我們可以定義一個名為“SmtpServerAddress”,在發送郵件時,獲取伺服器Ip地址。如果這個設置有個單一值(不是基於用戶而變),我們就可以把它定義為應用範圍。
- Tenant:如果應用多租戶,我們可以定義指定租戶的設置。
- User:我們可以使用一個用戶範圍的設置來存儲/獲取每個用戶指定設置的值。
SettingScopes枚舉有Flags(標誌)特性,所以我們可以用多個範圍(級別)定義一個設置。
設置範圍在預設情況下是有繼承關係的(除非你設置了isInherited為false)。例如,我們定義一個設置範圍為“Application | Tenant | user” 然後嘗試獲取設置的當前值:
- 如果它定義(重寫)為user,我們就獲取特定User的值。
- 如果不是,如果它定義(重寫)為tanant,我們就獲取特定Tenant的值。
- 如果不是,如果已定義,我們獲取Application值。
- 如果不是,我們獲取預設值。
預設值可能是null或“”。建議為設置儘可能地提供預設值。
context.Manager可獲取一個設置定義,並修改它的值,這種方式,可以操作依賴模塊的設置定義。
在定義一個設置後,我們可在服務端和客戶端獲取它的當前值。
ISettingManager用來執行設置操作,我們可在應用的任何地方註入並使用它。ISettingManager定義了許多獲取一個設置的值的方法。
常用的方法是GetSettingValue(或異常GetSettingValueAsync),獲取設置基於範圍級別(Application,Tenant,User)的當前值(如前面所述),例如:
//Getting a boolean value (async call) var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin"); //Getting a string value (sync call) var value2 = SettingManager.GetSettingValue("SmtpServerAddress");
GetSetrtingValue有泛型和異常版本,如上所述。當然也有方法能獲取一個指定租戶或用戶的設置值或所有值列表。
由於廣泛地使用了ISettingManager,一些特殊的基類(如ApplicationService,DomainService和AppController)有一個SettingManager屬性。如果你從這些類繼承,就不再需要顯式註入ISettingManager。
如果你在定義一個設置時,把IsVisibleToClicents設為true,那麼你可以在客戶端使用Javascript獲取它的當前值。abp.setting命名空間定義了所需的函數和對象,例如:
var currentColor = abp.setting.get("SiteColorPreference");
同樣還有getInt和getBoolean方法,你可以使用abp.setting.values對象獲取所有值。註意:如果你在服務端修改一個設置,除非刷新頁面、以某種方式重新載入設置和用手工代碼更新,否則客戶端不會知道這個修改。
ISetingManager定義了ChangeSettingForApplicationAsync,ChangeSettingForTenantAsync和ChangeSettingForUserAsync(和同步版)方法,分別為一個應用,一個租戶和一個用戶修改設置。
設置管理的緩存在服務端設置,所以我們不應該直接用倉儲或資料庫更新查詢來修改一個設置。