专栏首页大内老AASP.NET Core的配置(5):配置的同步[ 实例篇]

ASP.NET Core的配置(5):配置的同步[ 实例篇]

ConfigurationBuilder在生成以Configuration对象的时候会利用注册其中的ConfigurationProvider加载原始的配置数据,那么一旦配置源中的数据发生变化,应用程序中的使用的配置信息如何与之同步呢?如果需要在应用程序中实现对配置信息的实施同步,就需要对原始配置数据的进行监控,并在数据改变的时候重新加载配置数据。除此之外,重新加载的配置需要应用到程序中,我们必然需要一种通知机制。

为了让读者朋友们对配置同步机制在具体项目中的应用有个感官认识,我们先通过一个简单的实例来演示如何实现配置数据的实时同步。我们采用一个INI文件作为配置源,通过实施监控这个文件第一时间感知到文件内容的变换。一旦原始配置文件的内容发生改变,应用程序将重新加载配置,并通过注册的回掉操作应用新的配置。

我们先创建一个ASP.NET Core控制台应用并在project .json文件中添加相应的依赖。由于对原始配置文件的变换的监控相关的API实现在“Microsoft.Extensions.Configuration.FileProviderExtensions”这个NuGet包中,我们需要按照如下方式添加针对它的依赖。

   1: {
   2:   ...
   3:  
   4:   "dependencies": {
   5:     "Microsoft.Extensions.Configuration.Ini"                       : "1.0.0-rc1-final",
   6:     "Microsoft.Extensions.Configuration.Binder"                    : "1.0.0-rc1-final",
   7:     "Microsoft.Extensions.Configuration.FileProviderExtensions"    : "1.0.0-rc1-final"
   8:   },
   9: }

假设我们需要通过配置来当前应用使用的线程池的容量,这样的设置需要根据当前的负载进行调整,所以需要很高的时效性,我们希望一旦修改了INI文件的配置,应用程序中针对线程池的相关设置可以立即生效。简单起见,我们仅仅定义MinThreads 和MaxThreads这两个分别决定线程池容量区间的配置项,如下所示的ThreadPoolSettings 是对应的Options类型。

   1: public class ThreadPoolSettings
   2: {
   3:     public int MinThreads { get; set; }
   4:     public int MaxThreads { get; set; }
   5:     public override string ToString()
   6:     {
   7:         return string.Format("Thread pool size: [{0}, {1}]", this.MinThreads, this.MaxThreads);
   8:     }
   9: }

我们在作为应用入口的Main方法中编写了如下一段程序。我们按照我们熟悉的方式将Settinigs .ini 文件作为配置源生成了一个ConfigurationRoot对象,然后将这个INI文件的路径作为参数调用它的扩展方法ReloadOnChanged方法。顾名思义,当这个ReloadOnChanged方法执行之后,系统会监控指定物理文件的变换并在发生变化后调用ConfigurationRoot的Reload方法重新加载配置。

   1: public class Program
   2: {
   3:     private static IDisposable callbackRegistration;
   4:  
   5:     public static void Main(string[] args)
   6:     {
   7:         IConfigurationRoot configuration = new ConfigurationBuilder()
   8:             .AddIniFile("Settings.ini")
   9:             .Build()
  10:             .ReloadOnChanged("Settings.ini");
  11:  
  12:         callbackRegistration = configuration.GetReloadToken().RegisterChangeCallback(OnSettingChanged, configuration);
  13:  
  14:         Console.Read();
  15:     }
  16:  
  17:     private static void OnSettingChanged(object state)
  18:     {
  19:         callbackRegistration?.Dispose();
  20:         IConfiguration configuration = (IConfiguration)state;
  21:         Console.WriteLine(configuration.Get<ThreadPoolSettings>());
  22:         callbackRegistration = configuration.GetReloadToken().RegisterChangeCallback(OnSettingChanged, state);
  23:     }
  24: }

ConfigurationRoot的扩展方法 ReloadOnChanged实现了自身承载的配置与原始配置数据的同步,但是如何使用重新加载配置呢?这就要使用到我们在前面一直刻意忽略的一个名为ChangeToken的对象,而IConfiguration接口的GetReloadToken方法返回的就是这么一个对象。如上面的代码片段所示,我们调用ConfigurationRoot的GetReloadToken方法得到这个ChangeToken对象,并调用ChangeToken的RegisterChangeCallback方法注册一个在ConfigurationRoot重新加载时会自动执行的回掉操作。

注册的回掉操作实现在OnSettingsChanged方法中,方法的参数是在调用RegisterChangeCallback方法是指定的ConfigurationRoot对象,我们在该方法中将它承载的配置绑定为ThreadPoolSettings对象并将相关的信息打印在控制台上。由于ConfigurationRoot每次重新加载的时候都会生成新的ChangeToken,所以我们在OnSettingsChanged方法中重复地调用RegisterChangeCallback方法进行回掉注册。现在我们直接运行这段程序,然后认为地修改存储原始配置数据的INI文件。如上图所示,当每次我们修改这个INI文件的时候,应用程序的配置将实时地与之同步。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 采用Opserver来监控你的ASP.NET项目系列(二、监控SQL Server与Asp.Net项目)

    前言 之前有过2篇关于如何监控ASP.NET core项目的文章,有兴趣的也可以看看. 今天我们主要来介绍一下,如何使用Opserver监控我们的SQL Ser...

    GuZhenYin
  • Asp.Net WebAPI核心对象解析(三)

       对于.NET的分布式应用开发,可以供我们选择的技术和框架比较多,例如webservice,.net remoting,MSMQ,WCF等等技术。对于这些技...

    彭泽0902
  • ASP.NET SignalR2持久连接层解析

        越是到年底越是感觉浑身无力,看着啥也不想动,只期盼着年终奖的到来以此来给自己打一针强心剂。估摸着大多数人都跟我一样犯着这样浑身无力的病,感觉今年算是没挣...

    彭泽0902
  • ASP.NET MVC Autofac依赖注入的一点小心得(包含特性注入)

    前言 IOC的重要性 大家都清楚..便利也都知道..新的ASP.NET Core也大量使用了这种手法.. 一直憋着没写ASP.NET Core的文章..还是怕误...

    GuZhenYin
  • 使用RazorEngine对ASP.NET MVC的Views进行UnitTest

    有的时候我们需要对Razor最后生产的文本(HTML OR XML OR..)进行单元测试。 使用Nuget安装RazorEngine。 新建一个ASP.NET...

    kklldog
  • ASP.NET的session操作方法总结

        在开发ASP.NET程序时,需要对相关数据进行缓存,缓存较多的主要是用户的身份信息,现提供几个对session操作较为常用的方法: 1.添加sess...

    彭泽0902
  • Asp.net Core中SignalR Core预览版的一些新特性前瞻,附源码(消息订阅与发送二进制数据)

    前言 一晃一个月又过去了,上个月有个比较大的项目要验收上线.所以忙的脚不沾地.现在终于可以忙里偷闲,写一篇关于SignalR Core的文章了. 先介绍一下Si...

    GuZhenYin
  • 开源免费的.NET图像即时处理的组件ImageProcessor

       承接以前的组件系列,这个组件系列旨在介绍.NET相关的组件,让大家可以在项目中有一个更好的选择组件的介绍绝对不是一篇文章可以叙述完的,因为一个组件是经过开...

    彭泽0902
  • ASP.NET MVC 6路由技术

    在我们跳转到自定义路由之前,我们必须先了解下MVC6基于MVC5的基本变化。 ASP.NET MVC6将所有必要的启动服务,定义和配置的应用程序依赖关系放在一个...

    Techeek
  • Asp.Net WebApi核心对象解析(一)

        生活需要自己慢慢去体验和思考,对于知识也是如此。匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什...

    彭泽0902

扫码关注云+社区

领取腾讯云代金券