程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> <<ABP框架>> 設置管理,abp框架設置管理

<<ABP框架>> 設置管理,abp框架設置管理

編輯:關於.NET

<<ABP框架>> 設置管理,abp框架設置管理


文檔目錄

 

本節內容:

  • 簡介
    • 關於ISettingStore
  • 定義設置
    • setting scope(設置范圍)
    • 重寫設置定義
  • 獲取設置值
    • 服務端
    • 客戶端
  • 修改設置
  • 關於緩存

 

簡介

每個應用必需存儲一些設置,並在應用裡的某處使用它。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類的構造器有一些參數:

  • Name(必需):一個設置必須有一個系統范圍內唯一的名稱,最好定義成一個常量,而不是可變的字符串。
  • Default value:有一個默認值,可以是null或“”。
  • Scope:一個設置應該有它的Scope(見下方)。
  • Display name:一個顯示在UI上的本地化名稱字符串。
  • Description:一個顯示在UI上的本地化描述字符串
  • Group:只用在UI上,不在設置管理裡使用,用來群組設置。
  • IsVisibleToClients:設為true使客戶端上的設置可用。
  • isInherited:這個設置是否被租戶和用戶繼承(見“設置 scope”)。
  • customData:為這個定義設置一個用戶數據。

在創建一個設置供應器後,我們應該為我們的模塊,在預初始化方法裡注冊它。

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

設置供應器會自動被依賴注入所注冊,所以一個設置供應器可以注入任何依賴(如一個倉儲),以用途其它源建立設置定義。

 

setting scope(設置范圍)

在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(和同步版)方法,分別為一個應用,一個租戶和一個用戶修改設置。

 

關於緩存

設置管理的緩存在服務端設置,所以我們不應該直接用倉儲或數據庫更新查詢來修改一個設置。

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved