使用ChangToken配置变更监听

IChangeToken 接口

IChangeToken 传播已发生更改的通知。 IChangeToken 驻留在 Microsoft.Extensions.Primitives 命名空间中。

常用方法:IChangeToken 接口具有 RegisterChangeCallback(Action<Object>, Object) 方法,用于注册在令牌更改时调用的回调。 调用回调之前,必须设置 HasChanged

我们可以给Configuration对象注册一个ChangeCallBack回调方法,当配置文件改变时我们输出改变后的新值。

当前Json文件配置为:

{
  "Key1": "1",
  "Key2": "a1",
  "Key3": "v1"
}
class Program
    {
        static void Main(string[] args)
        {
            var builder = new ConfigurationBuilder();

            builder.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true);

            var configurationRoot = builder.Build();

            IChangeToken changeToken = configurationRoot.GetReloadToken();

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

            Console.ReadKey();
        }
    }

当我们修改Json文件时,回调函数将会被调用。

但此回调仅仅会被执行一次,如果继续改变Json文件配置的值,回调函数也不会在触发了。所以我们如果想做到长时间的监控可以用ChangeToken类中的OnChange拓展方法。

ChangeToken 类

ChangeToken 是静态类,用于传播已发生更改的通知。 ChangeToken 驻留在 Microsoft.Extensions.Primitives 命名空间中。

ChangeToken.OnChange(Func<IChangeToken>, Action) 方法注册令牌更改时要调用的 Action

  • Func<IChangeToken> 生成令牌。
  • 令牌更改时,调用 Action

ChangeToken.OnChange<TState>(Func<IChangeToken>, Action<TState>, TState) 重载还具有一个 TState 参数,该参数传递给令牌使用者 Action

OnChange 返回 IDisposable。 调用 Dispose 将使令牌停止侦听更多更改并释放令牌的资源。

这里注意第一个入参是一个泛型委托

ChangeToken.OnChange(() => configurationRoot.GetReloadToken(), () =>
{
//You Want To Do
});
原文地址:https://www.cnblogs.com/Xieyiincuit/p/13977405.html