.NET 6 中的 ConfigurationManager

.NET 6 中的 ConfigurationManager

Intro

.NET 6 为了 Minimal API 引入了一些新东西,其中就包含了一个全新的配置对象 ConfigurationManager

这并不是 .NET Framework 里的静态类 ConfigurationManager,而是 .NET Core 里的配置 Microsoft.Extensions.Configuration 中的一个新类型,新的 ConfigurationManager 对象是之前的 ConfigurationBuilderConfigurationRoot 的结合

Implement

API Proposal:

namespace Microsoft.Extensions.Configuration
{
+    public sealed class ConfigurationManager : IConfigurationRoot, IConfigurationBuilder, IDisposable
+    {
+        public ConfigurationManager();
+        public string? this[string key] { get; set; }
+        public IConfigurationSection GetSection(string key);
+        public void Dispose();
+    }

Implement:

public sealed class ConfigurationManager : IConfigurationBuilder, IConfigurationRoot, IDisposable
{private readonly ConfigurationSources _sources;private readonly ConfigurationBuilderProperties _properties;private readonly object _providerLock = new();private readonly List<IConfigurationProvider> _providers = new();private readonly List<IDisposable> _changeTokenRegistrations = new();private ConfigurationReloadToken _changeToken = new();/// <summary>/// Creates an empty mutable configuration object that is both an <see cref="IConfigurationBuilder"/> and an <see cref="IConfigurationRoot"/>./// </summary>public ConfigurationManager(){_sources = new ConfigurationSources(this);_properties = new ConfigurationBuilderProperties(this);// Make sure there's some default storage since there are no default providers.this.AddInMemoryCollection();AddSource(_sources[0]);}// ...
}

ConfigurationManager在添加 ConfigurationSource 的时候也会注册 IConfigurationProvider,这样在添加 Source 之后就能够拿到 Configuration 中的配置了,在实现上,微软封装了一个私有的 ConfigurationSource 的类型,这里我们看一下注册配置源的代码

private class ConfigurationSources : IList<IConfigurationSource>
{private readonly List<IConfigurationSource> _sources = new();private readonly ConfigurationManager _config;public ConfigurationSources(ConfigurationManager config){_config = config;}public IConfigurationSource this[int index]{get => _sources[index];set{_sources[index] = value;_config.ReloadSources();}}public void Add(IConfigurationSource source){_sources.Add(source);_config.AddSource(source);}// ...
}

ConfigurationManager 中的 AddSource 方法实现如下:

IConfigurationBuilder IConfigurationBuilder.Add(IConfigurationSource source)
{_sources.Add(source ?? throw new ArgumentNullException(nameof(source)));return this;
}private void RaiseChanged()
{var previousToken = Interlocked.Exchange(ref _changeToken, new ConfigurationReloadToken());previousToken.OnReload();
}// Don't rebuild and reload all providers in the common case when a source is simply added to the IList.
private void AddSource(IConfigurationSource source)
{lock (_providerLock){var provider = source.Build(this);_providers.Add(provider);provider.Load();_changeTokenRegistrations.Add(ChangeToken.OnChange(() => provider.GetReloadToken(), () => RaiseChanged()));}RaiseChanged();
}

可以看到每次新加一个配置源的时候,都会去构建对应的一个 IConfigurationProvider 而且会去加载配置数据并注册配置更新事件,所以我们注册完配置之后才能够获取到配置,更多实现细节参考 Github 上的源码:https://github.com/dotnet/runtime/blob/v6.0.0-rc.1.21451.13/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs

Sample

来看下面使用时的 Sample 吧,非常的简单

const string testKey = "test";var configuration = new ConfigurationManager();
Console.WriteLine(configuration[testKey]);configuration.AddInMemoryCollection(new Dictionary<string, string>()
{{ testKey, "test" }
});
Console.WriteLine(configuration[testKey]);
Console.ReadLine();

输出结果如下:

24bdcf17846dc8db7b2a4e0b1562c647.png

第一次输出的时候还没有注册配置输出的是空,第一次输出的时候已经注册了配置输出的是我们配置的值

代码示例在可以从 Github 获取 https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/ConfigurationManagerSample/Program.cs

More

目前来说,ConfigurationManager 对象主要是为了 .NET 6 的 Minimal API 的需要,.NET 6 的 Minimal API 里用了这个,可以参考:https://github.com/dotnet/aspnetcore/blob/v6.0.0-rc.1.21452.15/src/DefaultBuilder/src/WebApplicationBuilder.cs ,但就像上面的示例一样,我们也是可以直接使用的,而且原来的 IConfigurationBuilder 依然是可以用的,无需担心升级到 .NET 6 会 break 的问题。

对于需要用到配置的测试程序直接用 ConfigurationManager 会更为简单一些,不需要先声明一个 ConfigurationBuilder 的对象注册好配置之后再构建一个 IConfiguration 对象,直接用一个对象就可以了,至少从我们写代码的角度会简单很多,但是性能会稍差一些,注册的配置源越多越明显,因为 ConfigurationManager 每次注册配置源的时候都会去构建和注册 IConfigurationProvider  而 IConfigurationBuilder 则是在最后 Build 的时候才构建一次,不过通常我们的配置也只是启动时只用配置一次,个人认为是可以接受的

References

  • https://github.com/dotnet/runtime/blob/v6.0.0-rc.1.21451.13/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationManager.cs

  • https://github.com/dotnet/runtime/blob/v6.0.0-rc.1.21451.13/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationRoot.cs

  • https://github.com/dotnet/runtime/blob/v6.0.0-rc.1.21451.13/src/libraries/Microsoft.Extensions.Configuration/src/ConfigurationBuilder.cs

  • https://github.com/dotnet/runtime/pull/55338

  • https://github.com/dotnet/runtime/issues/51770

  • https://github.com/dotnet/aspnetcore/blob/v6.0.0-rc.1.21452.15/src/DefaultBuilder/src/BootstrapHostBuilder.cs

  • https://github.com/dotnet/aspnetcore/blob/v6.0.0-rc.1.21452.15/src/DefaultBuilder/src/WebApplicationBuilder.cs

  • https://github.com/WeihanLi/SamplesInPractice/blob/master/net6sample/ConfigurationManagerSample/Program.cs

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/297640.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

60个高质量的CSS、XHTML网页布局模板下载

无论您下载和解剖预建模板是为了学习最新的CSS布局技术&#xff0c;或者下载的目的是为了易于编辑制作现成的独立网站&#xff0c;您都不应该仅限于免费且可用的一个拥有众多克隆版本、陈旧的且往往是枯燥的模板。网页设计的流行趋势和技术总是在千变万化&#xff0c;因此&…

总有人会偷看你的朋友圈

全世界只有3.14 % 的人关注了爆炸吧知识生活中&#xff0c;总是会有人在默默关注着你。你的朋友圈&#xff0c;常常有人来“偷偷”光顾&#xff0c;而这些细枝末节常常被我们忽视。 你不想让关心你的人失望&#xff0c;于是在朋友圈分享优质文章&#xff0c;希望你的快乐…

关于tomcat的使用方法(配置及使用)

前一段时间要做一个音乐播放器&#xff0c;要实现在线下载歌曲功能&#xff0c;这里要用到服务器&#xff0c;我决定使用Tomcat。 1.下载tomcat http://tomcat.apache.org/ 推荐下载7.0 版本&#xff08;8.0刚出来&#xff0c;据说还有些问题&#xff1b;6.0反正我没搭建好&a…

HTML5中常见的列表标签包括,介绍几个常用的HTML5标签

一、Html的基本结构&#xff1a;网页的文本、图片等信息&#xff1b;二、Head部分&#xff1a;用于表示网页的元数据即描述网页的基本信息其常用标签及属性有&#xff1a;1、title标签&#xff1a;浏览器标签页显示的标题2、meta标签&#xff1a;其常用属性①charset:设置文档的…

正弦波 程序 角度传感器_激光位移传感器的原理及应用领域

激光位移传感器是利用激光技术进行测量的传感器&#xff0c;由激光器、激光检测器和测量电路组成。作为新型测量设备&#xff0c;激光位移传感器能够精确非接触测量被测物体的位置、位移等变化&#xff0c;还可测量位移、厚度、振动、距离、直径等精密的几何测量。目前&#xf…

Dapr牵手.NET学习笔记:状态管理之docker-compose发布

Dapr牵手.NET学习笔记&#xff1a;想入非非的服务调用Dapr牵手.NET学习笔记&#xff1a;跨物理机负载均衡服务调用Dapr牵手.NET学习笔记&#xff1a;用docker-compose部署服务说明&#xff1a;为了给出demo的全貌&#xff0c;这篇有点长&#xff0c;如果有上一篇的基础&#xf…

linux tomcat 启动权限不足解决办法

2019独角兽企业重金招聘Python工程师标准>>> 用命令 chmod 755 文件名 即可 转载于:https://my.oschina.net/pioneeer/blog/10374

她在哭,但我没资格安慰她......​

1 我没资格安慰她......▼2 妈妈的关心总是突如其来▼3 突然就热得离谱了▼4 当贾玲和沈腾开始演起韩剧▼5 有些菜一旦错过就不在▼6 这要不是德高望重的长老还真带不了这样的帽子▼7 连狗都比你会放风筝▼你点的每个赞&#xff0c;我都认真当成了喜欢

指定的文件不是虚拟磁盘 没有快照_vmware workstaiton 15 虚拟机克隆(4)

安装客户机操作系统和应用程序可能要耗费很多时间。通过使用克隆&#xff0c;您可以通过一次安装及配置过程制作很多虚拟机副本。克隆虚拟机比复制虚拟机更简单、更快速。当您需要将多个相同的虚拟机部署到一个组时&#xff0c;克隆功能会非常有用。例如&#xff0c;MIS 部门可…

源码免杀处理的技巧与tips

2019独角兽企业重金招聘Python工程师标准>>> 首先,要了解编译中MAP的利用: 第一步设置VC编译环境生成Map文件。在 VC 中&#xff0c;点击菜单“Project -> Settings”选项页&#xff08;或按下 AltF7&#xff09;&#xff0c;选择 C/C 选项卡&#xff0c;并在…

广东计算机专业软件排名前十大学,2017年全国计算机专业大学排名一览表

2017年全国计算机专业大学排名一览表计算机科学是一门包含各种各样与计算和信息处理相关主题的系统学科&#xff0c;从抽象的.算法分析、形式化语法等等&#xff0c;到更具体的主题如编程语言、程序设计、软件和硬件等。下面是小编收集的全国计算机专业大学排名一览表&#xff…

C# 通过正则表达式来限制控件输入有效性

&#xff0c;界面上允许用户输入的控件&#xff0c;大多是有一定限定的&#xff0c;比如电话号码&#xff0c;只允许11的数字&#xff0c;比如一些算法参数有取值范围限定&#xff0c;比如只允许[1,255]等&#xff0c;这种情况如果等用户输入运行后再在后台验证数据的有效性&am…

C# Winform编程之Button

参考了这篇文章&#xff1a; http://www.cnblogs.com/qianlifeng/archive/2010/04/13/1710869.html 我的代码&#xff1a; JButton.cs using System; using System.Collections.Generic; using System.ComponentModel; using System.Drawing; using System.Data; using System.…

电热水器和插座之间的相亲故事

2019独角兽企业重金招聘Python工程师标准>>> 回到武汉&#xff0c;租房&#xff0c;然后发现原来的热水器不出水。让房产公司派师傅过来修理&#xff0c;终究还是放弃治疗了。不久&#xff0c;安装了一个新的电热水器。 我喜出望外&#xff0c;等了两个周&#xff0…

mysql in优化_MySQL 探秘: 1 整体架构

新开坑&#xff0c;计划做一系列专辑。由于 MySQL 源码太庞大&#xff0c;不可能面面俱到&#xff0c;先从丁奇《MySQL 实战 45 讲》[1] 案例开始入手&#xff0c;case by case 来做分享。同时强烈推荐丁奇的课&#xff0c;真的是受益匪浅&#xff0c;感谢感谢~~最新版本己经是…

清华姚班/智班2020级新生来了!中国奥数新晋“一姐”在列,湖南、湖北人数最多...

全世界只有3.14 % 的人关注了爆炸吧知识乾明 金磊 发自 凹非寺量子位 报道 | 公众号 QbitAI清华姚班/智班&#xff0c;又双叒叕纳一批英才。根据教育部公示的保送生拟录取名单的信息&#xff0c;清华大学姚班/智班2020年已拟定录取31名应届生&#xff0c;他们都是来自各省的顶级…

成长 | 《大厂晋升指南》学习总结(下)

【学习总结】| Edison Zhou上一篇总结了面评技巧和学习方法部分&#xff0c;本篇总结做事方法和转向提升部分。温馨提示&#xff1a;文中的贴图均来自极客时间《大厂晋升指南》课程。1做事方法概要关于做事能力&#xff0c;有三条业界达成共识的判断标准&#xff0c;分别是闭环…

在SD/MMC卡中可读写的FAT文件系统

2019独角兽企业重金招聘Python工程师标准>>> FAT文件系统 关于eLua中FAT文件系统的实现是使用了来自Elm Chan的一个很好的FatFS文件包。它可以在读写模式中处理FAT12,FAT16和FAT32文件系统。而且它打包了很多功能通过封装的形式。跟ROM文件系统一样它也与C库集成在一…

hql取满足条件最新一条记录_MySql 之一条查询sql的执行过程

每当我把一条查询sql语句写完了&#xff0c;并且执行完得到想要的结果。这时我就在想为什么我写这样的一条sql语句&#xff0c;就能给我查询出我想要的结果&#xff0c;为什么我写了update就能更新一条语句&#xff1f;它们的执行过程是什么样的&#xff1f;它们的原理是什么&a…

高糊马赛克秒变高清,表情帝:这还是我吗?

全世界有3.14 % 的人已经关注了爆炸吧知识来源&#xff1a;机器之心参与&#xff1a;魔王、杜伟有了这个工具&#xff0c;我们终于能够看到马赛克下的那张脸了。给出一张高糊人脸照片&#xff0c;你能用它做什么&#xff1f;杜克大学近期的一项研究可以将高糊人脸照片转换成清晰…