使用强类型对象承载配置数据
组件包: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事件来监听配置源的变更状态。