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文件的时候,应用程序的配置将实时地与之同步。

ASP.NET Core的配置(1):读取配置信息
ASP.NET Core的配置(2):配置模型详解
ASP.NET Core的配置(3): 将配置绑定为对象[上篇]
ASP.NET Core的配置(3): 将配置绑定为对象[下篇]
ASP.NET Core的配置(4):多样性的配置源[上篇]
ASP.NET Core的配置(4):多样性的配置源[中篇]
ASP.NET Core的配置(4):多样性的配置源[下篇]
ASP.NET Core的配置(5):配置的同步[上篇]
ASP.NET Core的配置(5):配置的同步[下篇]

ASP.NET Core的配置(5):配置的同步[ 实例篇]的更多相关文章

  1. 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置

    ==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...

  2. [ASP.NET Core 3框架揭秘] 配置[1]:读取配置数据[上篇]

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  3. [ASP.NET Core 3框架揭秘] 配置[2]:读取配置数据[下篇]

    [接上篇]提到“配置”二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义 ...

  4. [ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步

    在<配置模型总体设计>介绍配置模型核心对象的时候,我们刻意回避了与配置同步相关的API,现在我们利用一个独立文章来专门讨论这个话题.配置的同步涉及到两个方面:第一,对原始的配置源实施监控并 ...

  5. [ASP.NET Core 3框架揭秘] 配置[3]:配置模型总体设计

    在<读取配置数据>([上篇],[下篇])上面一节中,我们通过实例的方式演示了几种典型的配置读取方式,接下来我们从设计的维度来重写认识配置模型.配置的编程模型涉及到三个核心对象,分别通过三个 ...

  6. [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]

    物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...

  7. [ASP.NET Core 3框架揭秘] 配置[6]:多样化的配置源[上篇]

    .NET Core采用的这个全新的配置模型的一个主要的特点就是对多种不同配置源的支持.我们可以将内存变量.命令行参数.环境变量和物理文件作为原始配置数据的来源.如果采用物理文件作为配置源,我们可以选择 ...

  8. [ASP.NET Core 3框架揭秘] 配置[4]:将配置绑定为对象

    虽然应用程序可以直接利用通过IConfigurationBuilder对象创建的IConfiguration对象来提取配置数据,但是我们更倾向于将其转换成一个POCO对象,以面向对象的方式来使用配置, ...

  9. 【ASP.NET Core】自定义的配置源

    本文的主题是简单说说如何实现 IConfigurationSource.IConfigurationProvider 接口来自定义一个配置信息的来源,后面老周给的示例是实现用 CSV 文件进行应用配置 ...

  10. ASP.NET MVC 4 插件化架构简单实现-实例篇

    先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...

随机推荐

  1. 《Web 前端面试指南》1、JavaScript 闭包深入浅出

    闭包是什么? 闭包是内部函数可以访问外部函数的变量.它可以访问三个作用域:首先可以访问自己的作用域(也就是定义在大括号内的变量),它也能访问外部函数的变量,和它能访问全局变量. 内部函数不仅可以访问外 ...

  2. ASP.NET Core 中的那些认证中间件及一些重要知识点

    前言 在读这篇文章之间,建议先看一下我的 ASP.NET Core 之 Identity 入门系列(一,二,三)奠定一下基础. 有关于 Authentication 的知识太广,所以本篇介绍几个在 A ...

  3. 基于spring注解AOP的异常处理

    一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...

  4. ASP.NET Aries 入门开发教程1:框架下载与运行

    背景: 鉴于框架的使用者越来越多,文档太少,不少用户反映框架的入门门槛太高. 好吧,再辛苦下,抽时间写教程吧! 步骤1:下载框架源码 开源地址:https://github.com/cyq1162/A ...

  5. SQLSERVER聚集索引与非聚集索引的再次研究(上)

    SQLSERVER聚集索引与非聚集索引的再次研究(上) 上篇主要说聚集索引 下篇的地址:SQLSERVER聚集索引与非聚集索引的再次研究(下) 由于本人还是SQLSERVER菜鸟一枚,加上一些实验的逻 ...

  6. css3中perspective

    perspective 属性定义 3D 元素距视图的距离,以像素计.该属性允许改变 3D 元素查看 3D 元素的视图.当为元素定义 perspective 属性时,其子元素会获得透视效果,而不是元素本 ...

  7. PHP之用户验证和标签推荐的简单使用

    本篇主要是讲解一些最简单的验证知识 效果图 bookmark_fns.php <?php require_once('output_fns.php'); require_once('db_fns ...

  8. 七牛云:ckeditor JS SDK 结合 C#实现多图片上传。

    成功了,搞了2天.分享一下经验. 首先是把官方的那个例子下载下来,然后照如下的方式修改. 其中tempValue是一个全局变量. function savetoqiniu() { var upload ...

  9. obj.style.z-index的正确写法

    obj.style.z-index的正确写法 今天发现obj.style.z-index在js里面报错,后来才知道在js里应该把含"-"的字符写成驼峰式,例如obj.style.z ...

  10. jquery-treegrid树状表格的使用(.Net平台)

    上一篇介绍了DataTable,这一篇在DT的基础之上再使用jquery的一款插件:treegrid,官网地址:http://maxazan.github.io/jquery-treegrid/ 一. ...