前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ASP.NET Core的配置(5):配置的同步[ 实例篇]

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

作者头像
蒋金楠
发布2018-01-15 15:31:11
1.1K0
发布2018-01-15 15:31:11
举报
文章被收录于专栏:大内老A大内老A

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

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

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

代码语言:javascript
复制
   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类型。

代码语言:javascript
复制
   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方法重新加载配置。

代码语言:javascript
复制
   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: }
10
10

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

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档