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文件的时候,应用程序的配置将实时地与之同步。
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):配置的同步[ 实例篇]的更多相关文章
- 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之三 —— 配置
==== 目录 ==== 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之一 —— 开篇 跟我学: 使用 fireasy 搭建 asp.net core 项目系列之二 —— ...
- [ASP.NET Core 3框架揭秘] 配置[1]:读取配置数据[上篇]
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...
- [ASP.NET Core 3框架揭秘] 配置[2]:读取配置数据[下篇]
[接上篇]提到“配置”二字,我想绝大部分.NET开发人员脑海中会立即浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化的配置定义 ...
- [ASP.NET Core 3框架揭秘] 配置[5]:配置数据与数据源的实时同步
在<配置模型总体设计>介绍配置模型核心对象的时候,我们刻意回避了与配置同步相关的API,现在我们利用一个独立文章来专门讨论这个话题.配置的同步涉及到两个方面:第一,对原始的配置源实施监控并 ...
- [ASP.NET Core 3框架揭秘] 配置[3]:配置模型总体设计
在<读取配置数据>([上篇],[下篇])上面一节中,我们通过实例的方式演示了几种典型的配置读取方式,接下来我们从设计的维度来重写认识配置模型.配置的编程模型涉及到三个核心对象,分别通过三个 ...
- [ASP.NET Core 3框架揭秘] 配置[7]:多样化的配置源[中篇]
物理文件是我们最常用到的原始配置载体,而最佳的配置文件格式主要有三种,它们分别是JSON.XML和INI,对应的配置源类型分别是JsonConfigurationSource.XmlConfigura ...
- [ASP.NET Core 3框架揭秘] 配置[6]:多样化的配置源[上篇]
.NET Core采用的这个全新的配置模型的一个主要的特点就是对多种不同配置源的支持.我们可以将内存变量.命令行参数.环境变量和物理文件作为原始配置数据的来源.如果采用物理文件作为配置源,我们可以选择 ...
- [ASP.NET Core 3框架揭秘] 配置[4]:将配置绑定为对象
虽然应用程序可以直接利用通过IConfigurationBuilder对象创建的IConfiguration对象来提取配置数据,但是我们更倾向于将其转换成一个POCO对象,以面向对象的方式来使用配置, ...
- 【ASP.NET Core】自定义的配置源
本文的主题是简单说说如何实现 IConfigurationSource.IConfigurationProvider 接口来自定义一个配置信息的来源,后面老周给的示例是实现用 CSV 文件进行应用配置 ...
- ASP.NET MVC 4 插件化架构简单实现-实例篇
先回顾一下上篇决定的做法: 1.定义程序集搜索目录(临时目录). 2.将要使用的各种程序集(插件)复制到该目录. 3.加载临时目录中的程序集. 4.定义模板引擎的搜索路径. 5.在模板引擎的查找页面方 ...
随机推荐
- H5坦克大战之【建造敌人的坦克】
公司这几天在准备新版本的上线,今天才忙里偷闲来写这篇博客.接着上一篇的"H5坦克大战之[玩家控制坦克移动2]"(http://www.cnblogs.com/zhouhuan/ ...
- 来,给Entity Framework热热身
先来看一下Entity Framework缓慢的初始化速度给我们更新程序带来的一种痛苦. 我们手动更新程序时通常的操作步骤如下: 1)把Web服务器从负载均衡中摘下来 2)更新程序 3)预热(发出一个 ...
- C# MVC 5 - 生命周期(应用程序生命周期&请求生命周期)
本文是根据网上的文章总结的. 1.介绍 本文讨论ASP.Net MVC框架MVC的请求生命周期. MVC有两个生命周期,一为应用程序生命周期,二为请求生命周期. 2.应用程序生命周期 应用程序生命周期 ...
- JavaScript正则表达式,你真的知道?
一.前言 粗浅的编写正则表达式,是造成性能瓶颈的主要原因.如下: var reg1 = /(A+A+)+B/; var reg2 = /AA+B/; 上述两个正则表达式,匹配效果是一样的,但是,效率就 ...
- 理解nodejs模块的scope
描述 原文档地址:https://docs.npmjs.com/misc/scope 所有npm模块都有name,有的模块的name还有scope.scope的命名规则和name差不多,同样不能有ur ...
- OEL上使用yum install oracle-validated 简化主机配置工作
环境:OEL 5.7 + Oracle 10.2.0.5 RAC 如果你正在用OEL(Oracle Enterprise Linux)系统部署Oracle,那么可以使用yum安装oracle-vali ...
- 阿里云学生优惠Windows Server 2012 R2安装IIS,ftp等组件,绑定服务器域名,域名解析到服务器,域名备案,以及安装期间错误的解决方案
前言: 这几天终于还是按耐不住买了一个月阿里云的学生优惠.只要是学生,在学信网上注册过,并且支付宝实名认证,就可以用9块9的价格买阿里云的云服务ECS.确实是相当的优惠. 我买的是Windows S ...
- pt-heartbeat
pt-heartbeat是用来监测主从延迟的情况的,众所周知,传统的通过show slave status\G命令中的Seconds_Behind_Master值来判断主从延迟并不靠谱. pt-hea ...
- python 3.5 成功安装 scrapy 的步骤
http://www.cnblogs.com/hhh5460/p/5814275.html
- 说说BPM数据表和日志表中几个状态字段的详细解释
有个客户说需要根据这些字段的值作为判断条件做一些定制化需求,所以需要知道这些字段的名词解释,以及里面存储的值具体代表什么意思 我只好为你们整理奉上这些了! Open Work Sheet 0 Sav ...