ABP(现代ASP.NET样板开发框架)系列之九、ABP设置管理

点这里进入ABP系列文章总目录javascript

 

基于DDD的现代ASP.NET开发框架--ABP系列之九、ABP设置管理
html

 

ABP是“ASP.NET Boilerplate Project (ASP.NET样板项目)”的简称。java

ABP的官方网站http://www.aspnetboilerplate.comgit

ABP在Github上的开源项目https://github.com/aspnetboilerplategithub

 


本文由山东-李伟提供翻译数据库

介绍

每一个应用程序须要存储一些设置并在应用程序的某个地方使用这些设置。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 (必填):必须具备全系统惟一的名称。比较好的办法是定义字符串常量来设置Name。
  • Default value: 设置一个默认值。此值能够是null 或空字符串。
  • Scopes: 定义设置的范围 (见下文)。
  • Display name: 一个可本地化的字符串,用于之后在UI中显示设置的名称。
  • Description: 一个可本地化的字符串,用于之后在UI中显示设置的描述。
  • Group: 可用于设置组。这仅仅是UI使用,不用于设置管理。
  • IsVisibleToClients: 设置为 true 将使设置在客户端可用。

在建立设置提供程序(SettingProvider)以后,咱们应该在预初始化(PreIntialize)方法中注册咱们的模块:

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

设置提供程序会自动注册依赖注入。因此,设置提供程序能够注入任何依赖项 (如存储库) 来生成设置定义的一些其它来源。

 

设置范围

有三个设置范围 (或级别) 在 SettingScopes 枚举中定义:

  • Application:应用程序范围设置用于用户/租户独立的设置。例如,咱们能够定义一个名为"SmtpServerAddress"的设置,当发送电子邮件时,获取服务器的 IP 地址。若是此设置有一个单一的值 (不基于用户改变),那么咱们能够定义它为应用程序范围。
  • Tenant:若是应用程序是多租户的,咱们能够定义特定于租户的设置。
  • User:咱们能够使用的用户范围的设置来为每一个用户存储/获取设置的值。

SettingScopes 枚举具备Flags属性,因此咱们能够定义一个具备多个做用域的设置。


设置范围是分层的。例如,若是咱们定义设置范围为"Application | Tenant | User"并尝试获取当前设置的值;

  • 咱们获取特定用户的值,若是它定义 (重写) User。
  • 若是没有,咱们获取特定的租户值,若是它定义 (重写) Tenant。
  • 若是没有,咱们获取应用的值,若是它定义Application。
  • 若是没有,咱们获得的默认值。

默认值能够是 null 或空字符串。若是能够,建议为设置提供一个默认值。

获取设置值

定义设置后,咱们能够在服务器和客户端获取到它的当前值。

(1)服务器端(Server side)

ISettingManager 用于执行设置操做。咱们能够在应用程序中任何地方注入和使用它。ISettingManager 定义了不少获取设置值方法。

最经常使用的方法是 GetSettingValue (或GetSettingValueAsync 为异步调用)。它将返回当前设置的基于默认值、 应用程序、 租户和用户设置范围的值(如设置范围以前的一段中所述)。例子:

//Getting a boolean value (async call)
var value1 = await SettingManager.GetSettingValueAsync<bool>("PassiveUsersCanNotLogin");
//Getting a string value (sync call)
var value2 = SettingManager.GetSettingValue("SmtpServerAddress");

 

GetSettingValue 有泛型和异步版本,如上所示。也有方法来获取特定的租户或用户的设置值或全部设置值的列表。

因为ISettingManager使用普遍,一些特定的基类 (如 ApplicationService、 DomainService 和 AbpController) 有一个名为 SettingManager的属性。若是咱们从这些类继承,就无需显式地注入它。

(2)客户端

若是定义设置时将 IsVisibleToClients 设置为 true,就能够在客户端使用 javascript获得它的当前值。abp.setting 命名空间定义所需的函数和对象。示例:

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

也有 getInt 和 getBoolean 这样的方法。你能够使用 abp.setting.values 对象获取全部值。请注意,若是你在服务器端更改设置,客户端不会知道这种变化,除非刷新页面或者以某种方式从新加载页面或者经过代码手动更新。

更改设置

ISettingManager 定义了 ChangeSettingForApplicationAsyncChangeSettingForTenantAsyncChangeSettingForUserAsync 方法(以及同步版本)来更改应用程序,租户和用户分别的设置。

关于缓存

缓存在服务器端设置管理,因此,咱们不该直接使用存储库或数据库更新语句改变设置的值。

 


 

但愿更多国内的架构师能关注到ABP这个项目,也许这其中有能帮助到您的地方,也许有您的参与,这个项目能够发展得更好。

欢迎加ABP架构设计交流QQ群:134710707

ABP架构设计交流群

 

点这里进入ABP系列文章总目录

相关文章
相关标签/搜索