场景

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

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

关键方法

  • IChangeToken IConfiguration.GetReloadToken()

示例

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

  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.Primitives;
  3. using System;
  4. namespace ConfigurationFileDemo
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var builder = new ConfigurationBuilder();
  11. var root = builder.AddJsonFile("appsettings.json", true, true).Build();
  12. IChangeToken token = root.GetReloadToken();
  13. token.RegisterChangeCallback(state =>
  14. {
  15. Console.WriteLine($"Key1 : {root["key1"]}");
  16. Console.WriteLine($"Key2 : {root["key2"]}");
  17. Console.WriteLine($"Key3 : {root["key3"]}");
  18. }, root);
  19. Console.ReadKey();
  20. }
  21. }
  22. }

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

  1. using System;
  2. namespace Microsoft.Extensions.Primitives
  3. {
  4. public interface IChangeToken
  5. {
  6. bool HasChanged { get; }
  7. bool ActiveChangeCallbacks { get; }
  8. IDisposable RegisterChangeCallback(Action<object> callback, object state);
  9. }
  10. }

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

接下来执行我们的代码,运行起来之后去修改Json文件
image.png
"Key1": "Value1",修改为"Key1": "NewValue1"保存,会发现控制台窗口进行了输出,而输出正式我们修改之后的值
image.png
然后我们再次修改,发现没有反应,这是因为这个方法只会生效一次,而想要再次注册,只能在方法内部再获取一次新的token执行方法,这样就会造成套娃,对于这种情况下,巨硬当前会给我们提供一个便捷的方式。
ChangeToken类上有一个静态方法OnChange,这个方法可以帮助我们很轻松的来去处理这件事情,代码如下

  1. using Microsoft.Extensions.Configuration;
  2. using Microsoft.Extensions.Primitives;
  3. using System;
  4. namespace ConfigurationFileDemo
  5. {
  6. class Program
  7. {
  8. static void Main(string[] args)
  9. {
  10. var builder = new ConfigurationBuilder();
  11. var root = builder.AddJsonFile("appsettings.json", true, true).Build();
  12. ChangeToken.OnChange(() => root.GetReloadToken(), () =>
  13. {
  14. Console.WriteLine($"Key1 : {root["key1"]}");
  15. Console.WriteLine($"Key2 : {root["key2"]}");
  16. Console.WriteLine($"Key3 : {root["key3"]}");
  17. Console.WriteLine("执行了!");
  18. });
  19. Console.WriteLine("开始了!");
  20. Console.ReadKey();
  21. }
  22. }
  23. }

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