配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置;第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置。接下来我们利用一个简单的.NET Core控制台应用来演示针对文件的配置会涉及到数据同步的问题,我们希望应用能够对原始配置文件实施监控,并在文件内容发生改变的时候从新加载并应用新的配置。针对JSON文件的配置源通过JsonConfigurationSource类型来表示,该类型定义在“Microsoft.Extensions.Configuration.Json”这个NuGet包中,所以我们需要在project.json文件中按照如下的形式添加针对这个NuGet包的依赖。[ 本文已经同步到《ASP.NET Core框架揭秘》之中]

   1: {

   2:   ...

   3:   "dependencies": {

   4:     ...    

   5:     "Microsoft.Extensions.Configuration.Json": "1.0.0"

   6:   }

   7: }

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

   1: public class ThreadPoolOptions

   2: {

   3:     public int MinThreads { get; set; }

   4:     public int MaxThreads { get; set; }

   5:  

   6:     public override string ToString()

   7:     {

   8:         return $"Thread pool size: [{MinThreads}, {MaxThreads}]";

   9:     }

  10: }

我们在项目中添加一个名为threadPool.json的文件来定义线程池的配置。除此之外,我们需要通过修改project.json与编译相关的配置让该文件在编译的时候自动拷贝到输出目录下(默认为bin目录)。具体来说,我们只需要按照如下的方式将该文件的路径设置为“builtOptions/copyToOutput”配置选购的值就可以了。

   1: {

   2:   ...

   3:   "buildOptions": {

   4:     ...

   5:     "copyToOutput": "threadPool.json"

   6:   }

   7: }

接下来我们编写了如下一段程序来演示应用中使用的配置如何与配置文件的内容保持同步。我们首先创建了一个ConfigurationBuilder对象,并在它上面注册了一个JsonConfigurationSource。在创建这个JsonConfigurationSource对象的时候,除了指定配置文件(“threadPool.json”)的路径之外,我们还将它的ReloadOnChange属性设置为True。顾名思义,这个ReloadOnChange属性的含义就是当原始配置文件的内容发生改变的时候是否需要重新加载配置。

   1: IConfiguration config = new ConfigurationBuilder()

   2:     .Add(new JsonConfigurationSource {Path = "threadPool.json", ReloadOnChange = true })

   3:     .Build();

   4:  

   5: Action changeCallBack = () => {

   6:     ThreadPoolOptions options = new ServiceCollection()

   7:         .AddOptions()

   8:         .Configure<ThreadPoolOptions>(config)

   9:         .BuildServiceProvider()

  10:         .GetService<IOptions<ThreadPoolOptions>>()

  11:         .Value;

  12:     Console.WriteLine(options);

  13: };

  14:  

  15: ChangeToken.OnChange(()=>config.GetReloadToken(), changeCallBack);

  16:  

  17: Random random = new Random();

  18: while (true)

  19: {

  20:     ThreadPoolOptions options = new ThreadPoolOptions

  21:     {

  22:         MinThreads = random.Next(10, 20),

  23:         MaxThreads = random.Next(40, 50)

  24:     };

  25:     File.WriteAllText(Path.Combine(AppContext.BaseDirectory, "threadPool.json"), JsonConvert.SerializeObject(options));

  26:     Task.Delay(5000).Wait();

  27: }

在利用ConfigurationBuilder得到Configuration对象之后,我们调用它的GetReloadToken方法得到一个ChangeToken对象,后者会帮助我们判断配置是否被重新加载。我们调用ChangeToken类型的静态方法OnChange为这个ChangeToken对象注册了一个回调,该回调会在配置被重新加载时自动执行。至于这个注册的回调,我们仅仅是采用Options模式得到配置绑定生成的ThreadPoolOptions对象,并将它的相关信息打印在控制台上。

在这段程序的最后,我们在一个无限循环中以5秒钟的间隔对threadPool.json文件进行更新。按照这段程序的意图,当我们每次完成了针对threadPool.json的更新之后,我们创建的Configuration对象会自动重新加载。Configuration一旦重新加载,之前调用它的GetReloadToken方法得到ChangeToken对象的HasChanged属性将变成True,注册在它上面的回调将被执行。所以最终的结果就是重新设置的配置会实时出现在控制台上,如下所示的输出结果证实了这一点。(S04)

.NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步的更多相关文章

  1. .NET Core采用的全新配置系统[10]: 配置的同步机制是如何实现的?

    配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.要了解配置同步机制的实现原理,先得从认识一个 ...

  2. .NET Core采用的全新配置系统[2]: 配置模型设计详解

    在<.NET Core采用的全新配置系统[1]: 读取配置数据>中,我们通过实例的方式演示了几种典型的配置读取方式,其主要目的在于使读者朋友们从编程的角度对.NET Core的这个全新的配 ...

  3. .NET Core采用的全新配置系统[3]: “Options模式”下的配置是如何绑定为Options对象

    配置的原子结构就是单纯的键值对,并且键和值都是字符串,但是在真正的项目开发中我们一般不会单纯地以键值对的形式来使用配置.值得推荐的做法就是采用<.NET Core采用的全新配置系统[1]: 读取 ...

  4. .NET Core采用的全新配置系统[1]: 读取配置数据

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

  5. .NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内存变量,环境变量和命令行参数]

    较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持.我们可以将内存变量.命令行参 ...

  6. .NET Core采用的全新配置系统[9]: 为什么针对XML的支持不够好?如何改进?

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

  7. .NET Core采用的全新配置系统[6]: 深入了解三种针对文件(JSON、XML与INI)的配置源

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

  8. .NET Core采用的全新配置系统[4]: “Options模式”下各种类型的Options对象是如何绑定的?

    旨在生成Options对象的配置绑定实现在IConfiguration接口的扩展方法Bind上.配置绑定的目标类型可以是一个简单的基元类型,也可以是一个自定义数据类型,还可以是一个数组.集合或者字典类 ...

  9. .NET Core采用的全新配置系统[7]: 将配置保存在数据库中

    我们在<聊聊默认支持的各种配置源>和<深入了解三种针对文件(JSON.XML与INI)的配置源>对配置模型中默认提供的各种ConfigurationSource进行了深入详尽的 ...

随机推荐

  1. Asp.net Boilerplate之AbpSession扩展

    当前Abp版本1.2,项目类型为MVC5. 以属性的形式扩展AbpSession,并在"记住我"后,下次自动登录也能获取到扩展属性的值,版权归"角落的白板报"所 ...

  2. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  3. 浅谈 Fragment 生命周期

    版权声明:本文为博主原创文章,未经博主允许不得转载. 微博:厉圣杰 源码:AndroidDemo/Fragment 文中如有纰漏,欢迎大家留言指出. Fragment 是在 Android 3.0 中 ...

  4. 从Script到Code Blocks、Code Behind到MVC、MVP、MVVM

    刚过去的周五(3-14)例行地主持了技术会议,主题正好是<UI层的设计模式——从Script.Code Behind到MVC.MVP.MVVM>,是前一天晚上才定的,中午花了半小时准备了下 ...

  5. 0-1背包问题蛮力法求解(java版本)

    sloves: package BackPack; public class Solves {  public int[] DecimaltoBinary(int n,int m)  {   int ...

  6. Eclipse中启动tomcat报错java.lang.OutOfMemoryError: PermGen space的解决方法

    有的项目引用了太多的jar包,或者反射生成了太多的类,异或有太多的常量池,就有可能会报java.lang.OutOfMemoryError: PermGen space的错误, 我们知道可以通过jvm ...

  7. node模块加载层级优化

    模块加载痛点 大家也或多或少的了解node模块的加载机制,最为粗浅的表述就是依次从当前目录向上级查询node_modules目录,若发现依赖则加载.但是随着应用规模的加大,目录层级越来越深,若是在某个 ...

  8. CSS 3学习——transition 过渡

    以下内容根据官方规范翻译以及自己的理解整理. 1.介绍 这篇文档介绍能够实现隐式过渡的CSS新特性.文档中介绍的CSS新特性描述了CSS属性的值如何在给定的时间内平滑地从一个值变为另一个值. 2.过渡 ...

  9. seaJs学习笔记2 – seaJs组建库的使用

    原文地址:seaJs学习笔记2 – seaJs组建库的使用 我觉得学习新东西并不是会使用它就够了的,会使用仅仅代表你看懂了,理解了,二不代表你深入了,彻悟了它的精髓. 所以不断的学习将是源源不断. 最 ...

  10. from表单提交数据之后,后台对象接受不到值

    如果SSH框架下,前段页面通过from表单提交数据之后,在后台对象显示空值,也就是接收不到值得情况下.首先保证前段输入框有值,这个可以在提交的时候用jQuery的id或者name选择器alert弹出测 ...