ABP理論學習之設置管理


返回總目錄


本篇目錄

介紹###

每個應用程序都需要存儲一些設置信息,然后在應用程序中的某個地方使用這些設置。ABP提供了健壯的基礎設施來存儲或檢索服務端和客戶端的應用程序,租戶,用戶級別的可用設置。

一個設置一般是存儲在數據庫(或其他源)的name-value字符串對。我們可以將非字符串的值轉換成字符串。

關於ISettingStore

為了使用設置系統,必須要實現ISettingStore。雖然你可以用自己的方式實現,但是它已完全實現在module-zero中了。

定義設置###

一個設置使用前必須先定義。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值:設置的默認值。可以為null或空字符串。
  • Scopes:一個設置應該定義它的范圍(看下面)。
  • Dispaly name:在UI上顯示的本地化的設置名。
  • Description:在UI上顯示的本地化的設置描述。
  • Group:用於組合設置。這個用於UI而不是設置管理。
  • IsVisibleToClients:客戶端是否可見。

創建一個設置提供器之后,我們應該在模塊的PreInitialize方法中注冊。

Configuration.Settings.Providers.Add<MySettingProvider>();

這樣,設置提供器就自動注冊到依賴注入系統中了。因此,設置提供器可以使用一些其他的資源注入任何依賴(如倉儲)來生成設置定義。

設置范圍

SettingScope枚舉類中定義了三種設置范圍(或者說等級)

  • Application:一個應用范圍的setting對象用於用戶或者租戶獨立的設置。比如,我們可以定義一個叫做“SmtpServerAddress”的設置來獲取發送郵件時服務端的IP地址。如果該setting有一個單一值(基於用戶不會改變),那么我們可以把它定義為應用范圍的。
  • Tenant:如果應用程序時多租戶的,那么我們可以定義租戶特定的setting。
  • User:我們可以定義存儲或者獲取特定用戶的設置。

SettingScopes枚舉類型有Flags特性,因此我們可以定義一個不止一個范圍的setting。

設置范圍是有層次的,比如,如果我們定義的設置范圍是“Application | Tenant | User”,並嘗試獲取該設置當前的值,那么:

  • 如果已定義了該用戶的setting,那么就會獲得該用戶特定的值。
  • 如果上面的條件不成立,並且已經定義了該用戶所屬租戶的setting,那么會獲得該租戶特定的值。
  • 如果上面的條件還不成立,如果定義了應用的值,那么會獲得該應用的值。
  • 最后,我們會獲得默認值

默認值可能是null或者空字符串。如果可能的話,建議為setting的默認值提供默認值。

獲取設置值###

定義了一個setting之后,我們就可以在客戶端和服務端獲得它當前的值。

服務端

ISettingManager用於執行setting操作。我們可以在應用中的任何地方注入並使用它。ISettingManager定義了許多獲取一個setting值的方法。

用的最多的方法是GetSettingValue(或者異步調用GetSettingValueAsync)。它會返回基於默認值,應用程序,租戶和用戶setting的當前的值(正如上面提到的)。例如:

//獲取一個bool值(異步調用)
var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");

//獲取一個string值(同步調用)
var value2 = SettingManager.GetSettingValue("SmtpServerAddress");

GetSettingValue有泛型和異步版本,如上面所示。也有獲得特定租戶或者用戶的setting值或者所有setting值的列表的方法。

因為ISettingManager使用廣泛,所以一些特殊的基類(如ApplicationService,DomainService和AbpController)就有了一個叫做SettingManager的屬性。如果我們從這些類中派生,那么就不需要顯式注入它了。

客戶端

當定義一個setting時,如果將IsVisibleToClients設置為true,那么可以使用javascript在客戶端獲得當前的值。abp.setting命名空間定義了一些用得到的函數和對象。例如:

var currentColor = abp.setting.get("SiteColorPreference");

也有getIntgetBoolean 方法。你可以使用abp.setting.values獲得所有的值。注意:如果在服務端更改了一個setting,那么如果頁面沒有更新,setting沒有重新加載或者通過代碼手動更新的話,那么客戶端就不知道該setting是否發生了變化。

更改設置###

ISettingManager為應用程序,租戶和用戶分別定義了ChangeSettingForApplicationAsync, ChangeSettingForTenantAsync和ChangeSettingForUserAsync方法來更改setting。

關於緩存###

Setting Manager(管理者)緩存到了服務端的setting了。因此,我們不應該使用倉儲或者數據庫更新來直接更改一個setting的值。


免責聲明!

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



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