知行合一|

hiwwwk

园龄:5年粉丝:4关注:12

2022-02-08 23:52阅读: 86评论: 0推荐: 0

12 | 配置变更监听:配置热更新能力的核心

场景

  • 需要记录配置源的变更时
  • 需要在配置数据变更时触发特定操作时

当我们需要追踪我们的配置发生变化时,在配置发生变化时我们需要执行一些特定的操作的时候,这个时候就需要我们来进行一定的编码,来跟踪我们配置的变化

关键方法

  • IChangeToken IConfiguration.GetReloadToken()

示例

使用上一篇笔记创建的控制台应用程序,将代码修改为:

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Primitives;
using System;

namespace ConfigurationFileDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            var root = builder.AddJsonFile("appsettings.json", true, true).Build();

            IChangeToken token = root.GetReloadToken();
            token.RegisterChangeCallback(state =>
            {
                Console.WriteLine($"Key1 : {root["key1"]}");
                Console.WriteLine($"Key2 : {root["key2"]}");
                Console.WriteLine($"Key3 : {root["key3"]}");
            }, root);

            Console.ReadKey();
        }
    }
}

IChangeToken token = root.GetReloadToken();这行代码获取一个IChangeToken 对象,接口定义

using System;

namespace Microsoft.Extensions.Primitives
{
    public interface IChangeToken
    {
        bool HasChanged { get; }
        bool ActiveChangeCallbacks { get; }
        IDisposable RegisterChangeCallback(Action<object> callback, object state);
    }
}

RegisterChangeCallback(Action<object> callback, object state)方法是用来注册我们的CallBack.

接下来执行我们的代码,运行起来之后去修改Json文件
image.png

"Key1": "Value1",修改为"Key1": "NewValue1"保存,会发现控制台窗口进行了输出,而输出正式我们修改之后的值

image.png

然后我们再次修改,发现没有反应,这是因为这个方法只会生效一次,而想要再次注册,只能在方法内部再获取一次新的token执行方法,这样就会造成套娃,对于这种情况下,巨硬当前会给我们提供一个便捷的方式。

ChangeToken类上有一个静态方法OnChange,这个方法可以帮助我们很轻松的来去处理这件事情,代码如下

using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Primitives;
using System;

namespace ConfigurationFileDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();
            var root = builder.AddJsonFile("appsettings.json", true, true).Build();

            ChangeToken.OnChange(() => root.GetReloadToken(), () =>
            {
                Console.WriteLine($"Key1 : {root["key1"]}");
                Console.WriteLine($"Key2 : {root["key2"]}");
                Console.WriteLine($"Key3 : {root["key3"]}");
                Console.WriteLine("执行了!");
            });
            Console.WriteLine("开始了!");
            Console.ReadKey();
        }
    }
}

使用OnChange第一个重载方法,第一个入参是Func获取IChangeToken的途径,传入root.GetReloadToken(),第二个是Action传入要执行的方法。
运行我们的代码,然后去修改Json文件,每次修改都会执行Action
image.png

本文作者:hiwwwk

本文链接:https://www.cnblogs.com/wwwk/p/15873370.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hiwwwk  阅读(86)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起