如何让.NET Core应用的配置与源文件保持同步?
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置;第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置。接下来我们利用一个简单的.NET Core控制台应用来演示针对文件的配置会涉及到数据同步的问题,我们希望应用能够对原始配置文件实施监控,并在文件内容发生改变的时候从新加载并应用新的配置。针对JSON文件的配置源通过JsonConfigurationSource类型来表示,该类型定义在“Microsoft.Extensions.Configuration.Json”这个NuGet包中,所以我们需要在project.json文件中按照如下的形式添加针对这个NuGet包的依赖。
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属性的含义就是当原始配置文件的内容发生改变的时候是否需要重新加载配置。
在利用ConfigurationBuilder得到Configuration对象之后,我们调用它的GetReloadToken方法得到一个ChangeToken对象,后者会帮助我们判断配置是否被重新加载。我们调用ChangeToken类型的静态方法OnChange为这个ChangeToken对象注册了一个回调,该回调会在配置被重新加载时自动执行。至于这个注册的回调,我们仅仅是采用Options模式得到配置绑定生成的ThreadPoolOptions对象,并将它的相关信息打印在控制台上。
在这段程序的最后,我们在一个无限循环中以5秒钟的间隔对threadPool.json文件进行更新。按照这段程序的意图,当我们每次完成了针对threadPool.json的更新之后,我们创建的Configuration对象会自动重新加载。Configuration一旦重新加载,之前调用它的GetReloadToken方法得到ChangeToken对象的HasChanged属性将变成True,注册在它上面的回调将被执行。所以最终的结果就是重新设置的配置会实时出现在控制台上,如下所示的输出结果证实了这一点。
如何让.NET Core应用的配置与源文件保持同步?的更多相关文章
- .NET Core采用的全新配置系统[8]: 如何实现配置与源文件的同步
配置的同步涉及到两个方面:第一,对原始的配置文件实施监控并在其发生变化之后从新加载配置:第二,配置重新加载之后及时通知应用程序进而使后者能够使用最新的配置.接下来我们利用一个简单的.NET Core控 ...
- ASP.NET Core开发-如何配置Kestrel 网址Urls
ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...
- 扒一扒.NET Core的环境配置提供程序
很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助. 目录 .NET Core中的配置 ASP.NET Core中的配置 扒一扒环境变量提供程序 ...
- asp.net core 将配置文件配置迁移到数据库(一)
asp.net core 将配置文件配置迁移到数据库(一) Intro asp.net core 配置默认是项目根目录下的 appsettings.json 文件,还有环境变量以及 command l ...
- asp.net core 系列 10 配置configuration (上)
一. ASP.NET Core 中的配置概述 ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供. configuration 将从各种配置源提供程序操作键 ...
- .Net core下的配置设置(二)——Option
我在前面的文章.Net core下的配置设置(一)——Configuration中介绍了.net core下配置文件的读取方法,在.net core中,直接从Configuration对象中读取的并不 ...
- .Net core下的配置设置(一)——Configuration
ASP.NET Core 中提供了一个Configuration 包,用以应用配置基于配置提供程序建立的键值对.这里以json文件配置的方式,简单的介绍一下它的用法. 首先定义一个配置文件appset ...
- Linux系统打开core dump的配置【转】
什么是core dump core dump又叫核心转储, 当程序运行过程中发生异常, 程序异常退出时, 由操作系统把程序当前的内存状况存储在一个core文件中, 叫core dump.core du ...
- ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程
原文:ASP.NET Core macOS 环境配置 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 是对 ASP.NET 有重大意义的一次重新设计.本章节我 ...
随机推荐
- C# DateTime.Compare时间大小对比
- C语言之对指针概念的初步探究
指针?什么是指针? 指针(pointer)是一个值为内存地址的变量(或数据对象). 接下来从变量的角度分析: 变量有两个属性,一个是地址,一个是值. 指针与普通变量的不同之处在于:指针变量的值是一个内 ...
- GitLab 遇到的坑
Job for postfix.service failed because the control process exited with error [zbb@storage1 ~]$ sudo ...
- yum安装zabbix故障报错
装zabbix时报错 [root@zabbix ~]# rpm -ivh zabbix-server-mysql-2.2.3-1.el6.x86_64.rpm zabbix-web-mysql-2.2 ...
- django基础学习
{{forloop.counter}} 这是html的自增序号 GET请求可以直接从URL中获取信息,POST请求不可以,可以把信息藏到一个隐藏的input文本框中 orm 的概念就是对象关系映射 ...
- Why Nexiq 125032 USB Link Truck diagnostic tool is so helpful ?
As for as I am concerned , Heavy Duty Diagnostic Nexiq 125032 USB is a helpful tool , which has exce ...
- Django视图系统
Django的view(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. ...
- vue vue-resource网络请求
在使用get/post 网络请求,需要下载插件 "vue-resource" npm install vue-resource -s 在路由要导入及注册 import Vue fr ...
- tcp的半连接与完全连接队列(二)
队列及参数 server端的半连接队列(syn队列) 在三次握手协议中,服务器维护一个半连接队列,该队列为每个客户端的SYN包开设一个条目(服务端在接收到SYN包的时候,就已经创建了request_s ...
- CharacterController控制的物体移动
CharacterController控制的物体移动: public class playerMove : MonoBehaviour { public float Speed; private C ...