写点什么

.NET6 新东西 --ConfigurationManager

作者:喵叔
  • 2021 年 11 月 09 日
  • 本文字数:1345 字

    阅读完需:约 4 分钟

.NET6 于 2021 年 11 月 9 日凌晨 0 点 30 分与 VS2022 一同发布,从今天开始我将带领大家来看一下.NET6 新引入的内容。今天我们先来看一下.NET6 中的 ConfigurationManager。这里所说的 ConfigurationManager 并不是.NET Framework 中的静态类 ConfigurationManager,而是.NET6 为 Minimal API 引入的一个新内容,它位于 Microsoft.Extensions.Configuration 中。简单的说.NET6 中的 ConfigurationManager 就是.NET Framework 中 ConfigurationBuilder 和 ConfigurationRoot 的结合体,我们在 ConfigurationManager 的源代码中就可以看出来:


/// <summary>    /// Configuration is mutable configuration object. It is both an <see cref="IConfigurationBuilder"/> and an <see cref="IConfigurationRoot"/>.    /// As sources are added, it updates its current view of configuration. Once Build is called, configuration is frozen.    /// </summary>    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(); //more code //.... // 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(); } //more code //..... }
复制代码


从上面的源码中我们可以看出来 ConfigurationManager 在添加 IConfigurationSource 的时候会注册 IConfigurationProvider。每添加一个新的配置源时都会去创建一个 IConfigurationProvider,并去加载配置数据和注册配置更新事件。因此才能在添加了 source 之后拿到 Configuration 中的配置。就目前来说,ConfigurationManager 主要用在 Minimal API 中,但是我们也可以在其他类型的项目中直接使用。而且.NET6 为我们做了兼容,即使在.NET6 中使用原来的 IConfigurationBuilder 也没有问题。但是这里有个问题,虽说使用 ConfigurationManager 会更加简单(对于编写代码来说),不用像以前那样先声明一个 IConfigurationBuilder 对象,并注册好后再创建一个 IConfiguration 对象,但性能会差一些,注册的配置源越多就越明显。因为每次 ConfigurationManager 注册配置源都会区创建并注册 IConfigurationProvider,但以前的方式则是在最后 Build 的时候才去创建。这里建议根据实际项目情况使用。

发布于: 2021 年 11 月 09 日阅读数: 9
用户头像

喵叔

关注

还未添加个人签名 2020.01.14 加入

还未添加个人简介

评论

发布
暂无评论
.NET6新东西--ConfigurationManager