Skip to content

设置管理

官方 Setting 模块参考文档

配置系统是在启动时配置应用程序很好的方式. 除了配置之外, ABP 提供了另外一种设置和获取应用程序设置的方式. 设置存储在动态数据源(通常是数据库)中的键值对. 设置系统预构建了用户,租户,全局和默认设置方法并且可以进行扩展.

定义设置

使用设置之前需要定义它. ABP 是 模块化的, 不同的模块可以拥有不同的设置. 只需要实现 SettingDefinitionProvider 类既可. 示例如下:

和官方 Setting 模块区别,值添加了 2 个属性,一个分组,一个组件类型

C#
public class CustomSettingProvider : SettingDefinitionProvider
{
    public override void Define(ISettingDefinitionContext context)
    {
     context.Add(
        new SettingDefinition(
                AbpProSettings.Other.Github,
                "https://github.com/WangJunZzz/abp-vnext-pro",
                L("DisplayName:" + AbpProSettings.Other.Github),
                L("Description:" + AbpProSettings.Other.Github)
            )
            // 分组
            .WithProperty(AbpProSettings.Group.Default,AbpProSettings.Group.OtherManagement)
            // 前端组件类型
            .WithProperty(AbpProSettings.ControlType.Default,AbpProSettings.ControlType.TypeText));
    }
}
  • SettingDefinition 类具有以下属性:

  • Name: 应用程序中设置的唯一名称. 是具有约束的唯一属性, 在应用程序获取/设置此设置的值 (设置名称定义为常量而不是魔法字符串是个好主意).

  • DefaultValue: 设置的默认值.
  • DisplayName: 本地化的字符串,用于在 UI 上显示名称.
  • Description: 本地化的字符串,用于在 UI 上显示描述.

  • 上面添加了 2 个属性,为了适配 vue 前端,一个设置 Setting 属于哪个分组,一个是根据 Setting 的类型指定对应的前端组件,比如字符串就是,Input 组件。

  • 支持以下组件:Text,CheckBox,Number

读取设置值

ISettingProvider 用于获取指定设置的值或所有设置的值. 示例用法:

C#
public class MyService
{
    private readonly ISettingProvider _settingProvider;

    //Inject ISettingProvider in the constructor
    public MyService(ISettingProvider settingProvider)
    {
        _settingProvider = settingProvider;
    }

    public async Task FooAsync()
    {
        //Get a value as string.
        string userName = await _settingProvider.GetOrNullAsync("Smtp.UserName");

        //Get a bool value and fallback to the default value (false) if not set.
        bool enableSsl = await _settingProvider.GetAsync<bool>("Smtp.EnableSsl");

        //Get a bool value and fallback to the provided default value (true) if not set.
        bool enableSsl = await _settingProvider.GetAsync<bool>(
            "Smtp.EnableSsl", defaultValue: true);

        //Get a bool value with the IsTrueAsync shortcut extension method
        bool enableSsl = await _settingProvider.IsTrueAsync("Smtp.EnableSsl");

        //Get an int value or the default value (0) if not set
        int port = (await _settingProvider.GetAsync<int>("Smtp.Port"));

        //Get an int value or null if not provided
        int? port = (await _settingProvider.GetOrNullAsync("Smtp.Port"))?.To<int>();
    }
}

ISettingProvider 是非常常用的服务,一些基类中(如 IApplicationService)已经将其属性注入. 这种情况下可以直接使用 SettingProvider.

  • ISettingProvider 使用设置值提供程序来获取设置值. 如果值提供程序无法获取设置值,则会回退到下一个值提供程序.
  • DefaultValueSettingValueProvider: 从设置定义的默认值中获取值.
  • ConfigurationSettingValueProvider: 从 IConfiguration 服务中获取值.
  • GlobalSettingValueProvider: 获取设置的全局值.
  • TenantSettingValueProvider: 获取当前租户的设置值.
  • UserSettingValueProvider: 获取当前用户的设置值.

设置回退系统从底部 (用户) 到 顶部(默认) 方向起作用.