文檔目錄
本節內容:
簡介
每個應用必需存儲一些設置,並在應用裡的某處使用它。ABP提供一個強大的基礎來存儲/獲取應用、租戶和用戶級別的設置,服務端與客戶端都可以。
一個設置是一對name-value字符串,通常存儲在數據庫(或其它源)。我們可以把不是字符串類的值,轉換成字符串後存儲。
關於 ISettingStore
為使用設置系統,必須實現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類的構造器有一些參數:
在創建一個設置供應器後,我們應該為我們的模塊,在預初始化方法裡注冊它。
Configuration.Settings.Providers.Add<MySettingProvider>();
設置供應器會自動被依賴注入所注冊,所以一個設置供應器可以注入任何依賴(如一個倉儲),以用途其它源建立設置定義。
setting scope(設置范圍)
在SettingScopes枚舉裡,有三個設置范圍(或級別):
SettingScopes枚舉有Flags(標志)特性,所以我們可以用多個范圍(級別)定義一個設置。
設置范圍在默認情況下是有繼承關系的(除非你設置了isInherited為false)。例如,我們定義一個設置范圍為“Application | Tenant | user” 然後嘗試獲取設置的當前值:
默認值可能是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(和同步版)方法,分別為一個應用,一個租戶和一個用戶修改設置。
關於緩存
設置管理的緩存在服務端設置,所以我們不應該直接用倉儲或數據庫更新查詢來修改一個設置。