---
description: 学习分享 丨作者 / 郑 子 铭 丨公众号 / DotNet NB / CloudNative NB
---

# 第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

GitHub源码链接：[https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationFileDemo](https://github.com/MingsonZheng/DotNetCoreDevelopmentActualCombat/tree/main/ConfigurationFileDemo)
