ABP-配置设置
配置设置
ABP遵循的是约定大于配置,作为约定的内容需要在应用程序中进行设置。
定义设置
在设置之前需要先定义他,由于ABP是模块化的,不同模块都可以拥有自己独立的设置参数,只需要在类中派生SettingDefinitionProvider
类
// ABP会自动发现并和注册设置的定义
public class StudentSettingProvider:SettingDefinitionProvider{
public override void Define(ISettingDefinitionContext context){
context.Add(
// key和value
new SettingDefinition("Student.Type", "Bus");
// 只声明一个key
new SettingDefinition("Student.Attribute");
);
}
}
SettingDefinition
SettingDefinition类有如下属性:
- Name: 应用程序中设置的唯一名称. 是具有约束的唯一属性, 在应用程序获取/设置此设置的值 (设置名称定义为常量而不是
magic
字符串是个好主意). - DefaultValue: 设置的默认值.
- DisplayName: 本地化的字符串,用于在UI上显示名称.
- Description: 本地化的字符串,用于在UI上显示描述.
- IsVisibleToClients: 布尔值,表示此设置是否在客户端可用. 默认为false,避免意外暴漏内部关键设置.
- IsInherited: 布尔值,此设置值是否从其他提供程序继承. 如果没有为请求的提供程序设置设定值,那么默认值是true并回退到下一个提供程序 (参阅设置值提供程序部分了解更多).
- IsEncrypted: 布尔值,表示是否在保存值是加密,读取时解密. 在数据库中存储加密的值.
- Providers: 限制可用于特定的设置值提供程序(参阅设置值提供程序部分了解更多).
- Properties: 设置此值的自定义属性 名称/值 集合,可以在之后的应用程序代码中使用.
获得SettingDefinition并更改属性
在模块中可能希望更改部分属性来重新定义某些属性的值
public class StudentSetting : SettingDefinitionProvider{
public override void Define(ISettingDefinitionContext context){
// 获得Name为Student.Type
var type = context.GetOrNull("Student.Type");
if(type != null){
// 改变默认值
type.DefaultValue = "Bike";
type.DisplayName = new LocalizableString(typeof(LocalizationResource), "Server_DisplayName");
}
}
}
读取设置值
应用层读取
在ABP框架中,所有基于IApplicationService
的类都默认注入了ISettingProvider属性,可直接在Service类中使用。
public class StudentAppService :
CrudAppService<
Student,
StudentDto, ks
Guid,
PagedAndSortedResultRequestDto,
CreateUpdateStudentDto>,
IStudentAppService
{
public override async Task<StudentDto> GetAsync(Guid id)
{
// 获得所有属性
List<SettingValue> vals = await this.SettingProvider.GetAllAsync();
}
}
对于未默认注入的类,可通过定义ISettingProvider来获取设置的数值
public class StudentAppComponent{
// 声明一个ISettingProvider实例
private readonly ISettingProvider _settingProvider;
// 通过构造器进行赋值
public StudentAppComponent(ISettingProvider settingProvider){
_settingProvider = settingProvider;
}
public async Task GetStudentAttr(){
string type = await _settingProvider.GetOrNullAsync("Student.Type");
}
}
前端读取
将IsVisibleToClients设置为true,那么可以使用javascript在客户端获得当前的值。
var type = abp.setting.get('Student.Type');
var attribute = abp.setting.getInt('Student.Attribute');
var isWorking = abp.setting.getBoolean('Student.isWorking');