zoukankan      html  css  js  c++  java
  • 配置绑定和自定义配置数据源

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

    组件包: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事件来监听配置源的变更状态。

  • 相关阅读:
    线程间的通信
    高速排序算法
    LightOJ 1205 Palindromic Numbers
    java异常处理
    Android Bundle类
    Linux守护进程的编程实现
    深入浅出JMS(一)——JMS简单介绍
    Maven安装与配置
    matlab学习------------普通dialog对话框,错误对话框errordlg,警告对话框warndlg
    读书笔记:计算机网络4章:网络层
  • 原文地址:https://www.cnblogs.com/Xieyiincuit/p/13978826.html
Copyright © 2011-2022 走看看