ASP.NET Core - 配置系统之自定义配置提供程序
4. 自定义配置提供程序
在 .NET Core 配置系统中封装一个配置提供程序关键在于提供相应的 IconfigurationSource 实现和 IConfigurationProvider 接口实现,这两个接口在上一章 ASP.NET Core - 配置系统之配置提供程序 中也有提到了。
IConfigurationSource
IConfigurationSource 负责创建 IConfigurationProvider 实现的实例。它的定义很简单,就一个Build方法,返回 IConfigurationProvider 实例:
public interface IConfigurationSource
{
IConfigurationProvider Build(IConfigurationBuilder builder);
}
IConfigurationProvider
IConfigurationProvider 负责实现配置的设置、读取、重载等功能,并以键值对形式提供配置。
public interface IConfigurationProvider
{
// 获取指定父路径下的直接子节点Key,然后 Concat(earlierKeys) 一同返回
IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath);
// 当该配置提供程序支持更改追踪(change tracking)时,会返回 change token
// 否则,返回 null
IChangeToken GetReloadToken();
// 加载配置
void Load();
// 设置 key:value
void Set(string key, string value);
// 尝试获取指定 key 的 value
bool TryGet(string key, out string value);
}
像工作中常用的配置中心客户端,例如 nacos、consul,都是实现了对应的配置提供程序,从而将配置中心中的配置无缝地接入到 .NET Core 的配置系统中进行使用,和本地配置文件的使用没有分别。
如果我们需要封装自己的配置提供程序,推荐直接继承抽象类 ConfigurationProvider,该类实现了 IConfigurationProvider 接口,继承自该类只要实现 Load 方法即可,Load 方法用于从配置来源加载解析配置信息,将最终的键值对配置信息存储到 Data 中。这个过程中可参考一下其他已有的配置提供程序的源码,模仿着去写自己的东西。
在我们日常的系统平台中,总少不了数据字典这样一个功能,用于维护平台中一些业务配置,因为是随业务动态扩展和变动的,很多时候不会写在配置文件,而是维护在数据库中。以下以这样一个场景实现一个配置提供程序。
因为是以数据库作为载体来存储配置信息,所以第一步就是定义实体类
public class DataDictioaryDO
{
public int Id {
get; set; }
public int? ParentId {
get; set; }
public string Key {
get; set; }
public string Value {
get; set; }
}
数据字典支持多级级联,通过 ParentId 关联上一级,ParentId 为空的即为根节点,如存在下级节点则 Value 值可以为空,就算填写了也无效,最终呈现出来的就是一个树结构。
然后就是定义相应的数据库访问上下文 DataDictionaryDbContext
public class DataDictionaryDbContext : DbContext
{
public DbSet<DataDictioaryDO> DataDictioaries {
get; set; }
public DataDictionaryDbContext(DbContextOptions<DataDictionaryDbContext> options) : base(options)
{
}
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
base.OnMode