配置绑定和自定义配置数据源

使用强类型对象承载配置数据

组件包:Microsoft.Extensions.Configuration.Binder

要点

  • 支持将配置值绑定到已有对象
  • 支持将配置值绑定到私有属性上

准备工作:

定义一个类来作为接受配置的实例 Config.cs

public class Config
{
    public string Key1 { get; set; }
    public int Key2 { get; set; }
    public bool Key3 { get; set; }

}

配置文件 MyJson.json

{
"key1": "Hello",
"Key2": 1,
"key3": true,
"key4":"Null" 
}

将组件包引用后,构造一个Config来接受配置文件:

 读取分层的配置文件:

MyJson.json

{
  "key1": "Hello",
  "Key2": 1,
  "key3": true,
  "key4": "Null",
  "section": {
    "key" : "key in section" 
  } 
}

我们想要读取section块里的信息,则先利用GetSection()方法返回具有指定子节键的配置子节后在进行绑定。

 

 当我们的类型变量为Private Set时, 我们想要从配置文件中绑定该值,则需要在Bind方法中设置Options。

 


自定义配置数据源

拓展步骤

  • 实现 IConfigurationSource
  • 实现 IConfigurationProvider
  • 实现 AddXXX扩展方法

 

MyConfigurationSource: 用来返回我们自定义的Provider

class MyConfigurationSource : IConfigurationSource
{
    public IConfigurationProvider Build(IConfigurationBuilder builder)
    {
        return new MyConfigurationProvider();
    }
}

MyConfigurationProvider: 利用线程每三秒改变读取当前时间,模拟配置源的变更。

public MyConfigurationProvider() : base()
{
    var timer = new Timer();
    timer.Elapsed += Timer_Elapsed;
    timer.Interval = 3000;
    timer.Start();
}

private void Timer_Elapsed(object sender, ElapsedEventArgs e)
{
    Load(true);
}

public override void Load()
{
    //加载数据
    Load(false);
}

void Load(bool reload)
{
    this.Data["lastTime"] = DateTime.Now.ToString(CultureInfo.CurrentCulture);
    if (reload)
    {
        base.OnReload();
    }
}

这个时候我们的扩展就大概完成了,我们可以通过builder.Add(new ConfigurationSource())来获取我们的自定义配置,但并不建议这样注入。因为这样我们必须将Provider设为Public暴露给第三方。

正确的且官方建议的做法应该为:设置一个扩展方法将配置源添加进ConfigurationBuilder.

public static IConfigurationBuilder AddMyConfiguration(this IConfigurationBuilder builder)
        {
            builder.Add(new MyConfigurationSource());
            return builder;
        }

Program.cs

class Program
{
    static void Main(string[] args)
    {
        var builder = new ConfigurationBuilder();
        builder.AddMyConfiguration();

        var configRoot = builder.Build();

        ChangeToken.OnChange(() => configRoot.GetReloadToken(), () =>
        {
            Console.WriteLine($"lastTime:{configRoot["lastTime"]}");
        });

        Console.WriteLine("开始了");
        Console.ReadKey();
    }
}

在我们定义我们的扩展的时候,建议是将具体的实现都定义成私有的,然后通过扩展方法的方式暴露出去。

利用ChangeToken的OnChange事件来监听配置源的变更状态。

 

posted @ 2020-11-15 20:42  zhouslthere  阅读(216)  评论(0编辑  收藏  举报