设置管理
配置系统是在启动时配置应用程序很好的方式. 除了配置之外, ABP 提供了另外一种设置和获取应用程序设置的方式. 设置存储在动态数据源(通常是数据库)中的键值对. 设置系统预构建了用户,租户,全局和默认设置方法并且可以进行扩展.
定义设置
使用设置之前需要定义它. ABP 是 模块化的, 不同的模块可以拥有不同的设置. 只需要实现 SettingDefinitionProvider 类既可. 示例如下:
注意
- 和官方 Setting 模块区别,值添加了 2 个属性,一个分组,一个组件类型
csharp
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));
}
}
csharp
/// <summary>
/// 前端控件类型
/// </summary>
public static class ControlType
{
public const string Default = "Type";
public const string TypeText = "Text";
public const string TypeCheckBox = "CheckBox";
public const string Number = "Number";
}
SettingDefinition 类具有以下属性:
- Name: 应用程序中设置的唯一名称. 是具有约束的唯一属性, 在应用程序获取/设置此设置的值 (设置名称定义为常量而不是魔法字符串是个好主意).
- DefaultValue: 设置的默认值.
- DisplayName: 本地化的字符串,用于在 UI 上显示名称.
- Description: 本地化的字符串,用于在 UI 上显示描述.
上面添加了 2 个属性,为了适配 vue 前端,一个设置 Setting 属于哪个分组,一个是根据 Setting 的类型指定对应的前端组件,比如字符串就是,Input 组件。
- 支持以下组件:Text,CheckBox,Number
读取设置值
ISettingProvider 用于获取指定设置的值或所有设置的值. 示例用法:
csharp
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: 获取当前用户的设置值.