• .NET Core开发实战(第12课:配置变更监听)--学习笔记


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

    这一节讲解如何使用代码来监视配置变化并做出一些动作

    当我们需要追踪配置发生的变化,可以在变化发生时执行一些特定的操作

    配置主要提供了一个 GetReloadToken 方法,这就是跟踪配置的关键方法

    接着使用上一节的代码

    var builder = new ConfigurationBuilder();
    builder.AddJsonFile("appsettings.json", optional:true, reloadOnChange:true);
    var configurationRoot = builder.Build();
    
    IChangeToken token = configurationRoot.GetReloadToken();
    

    IChangeToken 有两个属性和一个方法

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

    接着注册 Callback

    token.RegisterChangeCallback(state =>
    {
        Console.WriteLine($"Key1:{configurationRoot["Key1"]}");
        Console.WriteLine($"Key2:{configurationRoot["Key2"]}");
        Console.WriteLine($"Key3:{configurationRoot["Key3"]}");
    }, configurationRoot);
    

    启动程序,修改配置文件,触发 Callback

    多次修改配置文件没有效果?

    因为 IChangeToken 这个对象只能使用一次,也就是说捕获到变更并且执行代码之后,需要再重新获取一个新的 IChangeToken,再次注册

    token.RegisterChangeCallback(state =>
    {
        Console.WriteLine($"Key1:{configurationRoot["Key1"]}");
        Console.WriteLine($"Key2:{configurationRoot["Key2"]}");
        Console.WriteLine($"Key3:{configurationRoot["Key3"]}");
    
        token = configurationRoot.GetReloadToken();
        token.RegisterChangeCallback(state2 =>
        {
            Console.WriteLine();
        }, configurationRoot);
    }, configurationRoot);
    

    这将变成一个无限循环的过程,微软实际上提供了一个比较方便使用的快捷的扩展方法,这个方法可以帮助我们轻松地处理这件事,也就意味着每次触发完成以后可以重新绑定

    ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () =>
    {
        Console.WriteLine($"Key1:{configurationRoot["Key1"]}");
        Console.WriteLine($"Key2:{configurationRoot["Key2"]}");
        Console.WriteLine($"Key3:{configurationRoot["Key3"]}");
    });
    

    第一个参数是获取 IChangeToken 的方法

    第二个参数是处理变更的注入方法

    启动程序,修改配置文件,多次触发 Callback

    知识共享许可协议

    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

    欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。

    如有任何疑问,请与我联系 (MingsonZheng@outlook.com) 。

  • 相关阅读:
    【题解】警位安排( 树形 DP)
    【题解】任务分配
    Leo 搭积木
    受牛仰慕的牛
    zy 送画
    [NOIP2010] 乌龟棋
    [WikiOi 1214] 线段覆盖
    【拓扑习题】课程安排问题
    [WikiOI "天梯"1281] Xn数列
    [百度之星2014资格赛] Disk Schedule 报告
  • 原文地址:https://www.cnblogs.com/MingsonZheng/p/12381247.html
Copyright © 2020-2023  润新知