.NET 6全新配置对象ConfigurationManager介绍

介绍

本节为大家带来.NET 6新增的ConfigurationManager,很多人好奇为啥要讲这个,读取加载配置信息都随手就来了,我们往下看一下。

翻译:这添加了 ASP.NET Core 的新 WebApplcation WebApplicationBuilder已经使用的类型,允许从配置(例如appsettings.jsonDOTNET_/ASPNETCORE_环境变量)中读取,同时仍然能够添加新的配置源,而无需显式重建配置。每次通过IConfigurationBuilder界面添加源时IConfiguration,都会立即自动更新。

回顾历史

我们在使用.NET 5开发的时候,采用IConfigurationBuilder添加配置源。调用Build()构建器读取每个配置源,并构建最终配置IConfigurationRoot

private static IConfigurationRoot BuildConfiguration()
        {
            var builder = new ConfigurationBuilder()
                .SetBasePath(Path.Combine(Directory.GetCurrentDirectory(), "../MyCompanyName.MyProjectName.DbMigrator/"))
                .AddJsonFile("appsettings.json", optional: false);

            return builder.Build();
        }

当然我们正常系统开发基本上不会自己去调用ConfigurationBuilder或者调用Build(),这都在.Net Core底部给我们完成了。

那么这个类型推出的意义是什么呢?

举个栗子Use Application ID and X.509 certificate for non-Azure-hosted apps,这是微软官方给出的案例,我来说明一下,配置 Azure Key Vault 提供程序需要一个配置值, 那么我是先有鸡还是先有蛋呢——在构建配置之前无法添加配置源!。

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureAppConfiguration((context, config) =>
        {
            if (context.HostingEnvironment.IsProduction())
            {
                var builtConfig = config.Build();

                using var store = new X509Store(StoreLocation.CurrentUser);
                store.Open(OpenFlags.ReadOnly);
                var certs = store.Certificates.Find(
                    X509FindType.FindByThumbprint,
                    builtConfig["AzureADCertThumbprint"], false);

                config.AddAzureKeyVault(new Uri($"https://{builtConfig["KeyVaultName"]}.vault.azure.net/"),
                                        new ClientCertificateCredential(builtConfig["AzureADDirectoryId"], builtConfig["AzureADApplicationId"], certs.OfType<X509Certificate2>().Single()),
                                        new KeyVaultSecretManager());

                store.Close();
            }
        })
        .ConfigureWebHostDefaults(webBuilder => webBuilder.UseStartup<Startup>());

我们的步骤是:

  1. 初始化配置
  2. 调用IConfigurationBuilder.Build()构建配置
  3. 从IConfigurationRoot中检索所需的配置值
  4. 添加配置源
  5. 框架调用Build(),生成最终应用程序配置。

这里我们调用了Build()两次,这会产生什么问题呢?

ConfigurationBuilder.Build()每次调用会迭代所有源,加载提供者,并产生新的实例ConfigurationRoot.大家应该都懂读取文件所需的消耗吧。

新的实现

我们在使用ConfigurationManager时,当IConfigurationSource添加一个AddJsonFile()调用,提供程序会立即加载,并更新配置。

 using var config = new ConfigurationManager();

    config.AddEnvironmentVariables(prefix: "MyCustomPrefix_");

    if (config["FileConfig"] == "enabled")
    {
        config.AddJsonFile("MyConfig.json", optional: true, reloadOnChange: true);
    } 

    string myValueFromJson = config["JsonConfigValue"];

public class ConfigurationManager
{

    private void AddSource(IConfigurationSource source)
    {
        lock (_providerLock)
        {
            IConfigurationProvider provider = source.Build(this);
            _providers.Add(provider);

            provider.Load();
            _changeTokenRegistrations.Add(ChangeToken.OnChange(() => provider.GetReloadToken(), () => RaiseChanged()));
        }

        RaiseChanged();
    }
}

private void ReloadSources()
{
    lock (_providerLock)
    {
        DisposeRegistrationsAndProvidersUnsynchronized();

        _changeTokenRegistrations.Clear();
        _providers.Clear();

        foreach (var source in _sources)
        {
            _providers.Add(source.Build(this));
        }

        foreach (var p in _providers)
        {
            p.Load();
            _changeTokenRegistrations.Add(ChangeToken.OnChange(() => p.GetReloadToken(), () => RaiseChanged()));
        }
    }

    RaiseChanged();
}

注意:ConfigurationManager因为会任何源发生更改后必须删除所有内容并重新开始,遍历每个源,重新加载它们。如果你做了很多的配置源操纵的,那么如果使用ConfigurationManager会带来相反的效果.

ConfigurationManager适用于配置部分建造和、完全构建。

结语

请不要关心在使用.Net 6的时候该使用ConfigurationManager还是ConfigurationBuilder,在开发中根据需求去使用不同的加载方案才是最好的。

到此这篇文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • .NET6新特性之 隐式命名空间引用

    早在 .NET 6 Preview 7版本中微软就已经引入隐式命名空间引用.在.NET Preview 7这个版本中这个功能是默认开启的,如果需要禁用它的化就需要配置DisableImplicitNamespaceImports来禁用,但是到了.NET6 RC1版本的时候这个功能是禁用的,如果要使用就需要通过ImplicitUsings来启用.到了.NET6正式版中这个功能又又又默认开启了.下面我们以.NET6正式拜为例,来看一下怎么使用它吧! 如果我们要在新加一个命名空间的引用,可以在项目文件

  • NET6新特新 struct优化

    目录 一.Record Struct 二.readonly struct record 三.Parameterless Constructor 在.NET6中针对Struct做了一些优化,下面我们就通过一些案例来看一下.NET6中针对Struct的优化. 一.Record Struct 虽然在上一个版本中就有了record,但是上一版本中的的record是class是一个引用类型,但是record struct是值类型是一个结构, 它的使用方式如下: record struct Point(in

  • .net 6精简版webapi教程及热重载、代码自动反编译演示

    前言: .net6LTS版本发布已经有若干天了.此处做一个关于使用.net6开发精简版webapi(minimalapi)的入门教程,以及VS2022上面的两个强大的新技能(热重载.代码自动反编译)的顺带演示. 1.新建一个项目.此处就命名为SomeExample: 2.选择.net6版本,并且此处先去掉HTTPS配置以及去掉使用控制器的选项: 3.创建完成以后,原始画面如下所示.并且,解决方案一栏只剩下program文件,其他文件都被精简掉了.并且没有Main函数入口和命名空间等. 4.接下来

  • .NET 6线程池ThreadPool实现概述

    目录 前言 任务的调度 基本调度单元 IThreadPoolWorkItem 实现类的实例. Task 全局队列 本地队列 偷窃机制 Worker Thread 的生命周期管理 线程注入实验 .NET 5 实验一 默认线程池配置 .NET 5 实验二 调整 ThreadPool 设置 .NET 5 实验三 tcs.Task.Wait() 改为 Thread.Sleep .NET 6 实验一 默认 ThreadPool 设置 .NET 6 实验二 调整 ThreadPool 设置 .NET 6 实

  • .NET 6全新配置对象ConfigurationManager介绍

    介绍 本节为大家带来.NET 6新增的ConfigurationManager,很多人好奇为啥要讲这个,读取加载配置信息都随手就来了,我们往下看一下. 翻译:这添加了 ASP.NET Core 的新 WebApplcation 和 WebApplicationBuilder已经使用的类型,允许从配置(例如appsettings.json和DOTNET_/ASPNETCORE_环境变量)中读取,同时仍然能够添加新的配置源,而无需显式重建配置.每次通过IConfigurationBuilder界面添

  • Vue简明介绍配置对象的配置选项

    目录 一.methods 二.computer计算属性 三.watch 四.filter 一.methods 一般事件调用的函数都会在methods函数里面属性进行定义,在methods属性进行定义的函数,我们也可以称之为方法,一般作为事件的回调函数进行使用.这个被调用几次就能被执行几次. 我们可以通过实例代码来更好的理解我们这个实例: 实例代码: <!DOCTYPE html> <html lang="en"> <head> <title&g

  • jqPlot Option配置对象详解

    这里主要介绍jqPlot中核心部分--Option配置对象.同时,也会对jqplot的各个渲染器做个简单介绍. 这里主要是参考jqPlot官方网站关于Option的介绍并结自己简单实践和理解来对Option的相关属性进行解释,如有不合适或错误的地方请指正. 复制代码 代码如下: options = { seriesColors: [ "#4bb2c5", "#c5b47f", "#EAA228", "#579575", &qu

  • 基于Tomcat 数据源的原理、配置、使用介绍

    1.数据源的作用及操作原理 在程序代码中使用数据源是可以提升操作性能的,这种性能的提升依靠于运行的原理. 传统JDBC操作步骤 1.加载数据库驱动程序,数据库驱动程序通过CLASSPATH配置: 2.通过DriverManager类取得数据库连接对象: 3.通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库: 4.数据库属于资源操作,操作完成后进行数据库的关闭以释放资源.如图所示: 对于不同的用户只有操作不同,但是对于1.2.4三个步骤很明显是一个重复

  • Java Spring-Cache key配置注意事项介绍

    为了提升项目的并发性能,考虑引入本地内存Cache,对:外部数据源访问.Restful API调用.可重用的复杂计算 等3种类型的函数处理结果进行缓存.目前采用的是spring Cache的@Cacheable注解方式,缓存具体实现选取的是Guava Cache. 具体缓存的配置此处不再介绍,重点对于key的配置进行说明: 1.基本形式 @Cacheable(value="cacheName", key"#id") public ResultDTO method(i

  • vue中eslintrc.js配置最详细介绍

    本文是对vue项目中自带文件eslintrc.js的内容解析, 介绍了各个eslint配置项的作用,以及为什么这样设置. 比较详细,看完能对eslint有较为全面的了解,基本解除对该文件的疑惑. /** * 参考文档 * [eslint英文文档]https://eslint.org/docs/user-guide/configuring * [eslint中文文档]http://eslint.cn/docs/rules/ */ /** * eslint有三种使用方式 * [1]js代码中通过注释

  • viper配置框架的介绍支持zookeeper的读取和监听

    viper作为配置框架,其功能非常的强大,我们没有理由不去了解一下.我们先看官网对它的功能简介: viper是完整配置解决方案,他可以处理所有类型和格式的配置文件,他有如下功能: 设置默认配置 支持读取 JSON TOML YAML HCL 和 Java 属性配置文件 监听配置文件变化,实时读取读取配置文件内容 读取环境变量值 读取远程配置系统 (etcd Consul) 和监控配置变化 读取命令 Flag 值 读取 buffer 值 读取确切值 乍一看,未免有相见恨晚之感,可仔细一想,不免脑袋

  • Monaco-editor 的 JSON Schema 配置及使用介绍

    目录 JSON Schema 作用用法 JSON Schema Core Vocabulary $schema $id $ref $dynamicRef $anchor / $dynamicAnchor $defs 关键字 type title & description default examples deprecated readOnly & writeOnly $comment enum const 媒体类型关键字 contentMediaType contentEncoding

  • JBoss5.x下配置Log4j方法介绍

    最近在学习JBoss下配置Log4j,JBoss的各个版本的目录.JBoss和Log4j集成的文件名每次都有变化,在JBoss5.x下配置了log4j.xml文件,但是配置没有生效.如果你在项目中没有指定使用的log4j的配置文件,最好使用JBoss自带的配置文件,文件名为jboss-log4j.xml.该文件在Jboss容器的目录为:${JBOSS_HOME}\server\default\conf下.下面就是基于log4j默认配置的一些基本修改和注释: <span style="fon

  • Extjs4 GridPanel的主要配置参数详细介绍

    1.Ext.grid.GridPanel 主要配置项: store:表格的数据集 columns:表格列模式的配置数组,可自动创建ColumnModel列模式 autoExpandColumn:自动充满表格未用空间的列,参数为列id,该id不能为0 stripeRows:表格是否隔行换色,默认为false cm.colModel:表格的列模式,渲染表格时必须设置该配置项 sm.selModel:表格的选择模式,默认为Ext.grid.RowSelectionModel enableHdMenu:

随机推荐