维护者: real-zony
ABP 数据字典模块
Easy.Abp.Dictionary 库集成了标准的数据字典管理接口(增/删/改/查),同时提供了配套的字典值渲染组件。该组件支持自动(Attribute
)识别对应 DTO 的字典规则,并动态填充 DTO 值(反射)。
开发人员可以通过 NuGet 搜索 EasyAbp.Abp.DataDictionary.*
安装相应的组件,整个模块由以下几个包组成:
包名 | 备注 |
---|---|
EasyAbp.Abp.DataDictionary.Application.Contracts.Shared | |
EasyAbp.Abp.DataDictionary.Application.Contracts | |
EasyAbp.Abp.DataDictionary.Application | |
EasyAbp.Abp.DataDictionary.Domain.Shared | |
EasyAbp.Abp.DataDictionary.Domain | |
EasyAbp.Abp.DataDictionary.EntityframeworkCore | |
EasyAbp.Abp.DataDictionary.HttpApi | |
EasyAbp.Abp.DataDictionary.HttpApi.Client |
对应的 NuGet 包分别安装到 ABP vNext 项目的不同分层,并依赖对应的模块。
当前版本的所有配置都存放在 AbpDataDictionaryOptions
类中,开发人员可以在模块的 ConfigureServie()
或 PreConfigureService()
生命周期,使用 Configure<TOptions>(TOptions option)
方法配置对应的参数。
例子:
public class DemoModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpDataDictionaryOptions>(op =>
{
op.Rules.Add(new DataDictionaryRule
{
DictionaryCode = "字典类型编码",
DictionaryCodeProperty = null, // 字典类型编码的字段。
DtoType = null, // 输出 DTO 的类型。
RenderFieldProperty = null // 需要填充字典值(文本)的字段。
});
});
}
}
除了上面这种手动配置的方式以外,开发人员也可以在 DTO 标注特性来提供转换规则。
public class WaitCacheRenderDto
{
[DictionaryCodeField("XL")]
public string Level { get; set; }
[DictionaryRenderField("XL")]
public string LevelValue { get; set; }
}
上述代码表明 Level
字段存放的是字典值编码,它归属于 XL
字典,渲染具体字典值的时候,将 Level
编码对应的文字性描述赋值给 LevelValue
字段。当然你可以将两个特性都标注到 Level
上,这样新的值会直接复制给 Level
。
对于列表 DTO 来说,你可以将两个特性都标注在一个字段上,模块会自动覆盖掉原始值。
public class StudentGetListOutputDto : EntityDto<Guid>
{
public string Name { get; set; }
public int Age { get; set; }
public string Description { get; set; }
[DictionaryCodeField("Sex")]
[DictionaryRenderField("Sex")]
public string Sex { get; set; }
[DictionaryCodeField("Level")]
public string Level { get; set; }
[DictionaryRenderField("Level")]
public string LevelValue { get; set; }
}
配置完成以后,请在模块的 OnApplicationInitialization
方法使用 IDataDictionaryLoader
扫描对应的规则。
public class YourModule : AbpModule
{
public override void OnApplicationInitialization(ApplicationInitializationContext context)
{
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpDataDictionaryOptions>>().Value;
// 扫描其他模块。
var rules = context.ServiceProvider.GetRequiredService<IDataDictionaryLoader>().ScanRules(typeof(YourOtherModule).Assembly);
options.Rules.AddRange(rules);
}
}
Todo
- 编写 ASP.NET Core MVC Filter 和 Middleware 统一处理响应 DTO。
- 缓存 Property Info 提升性能。