NetCore配置详解(1)

一、依赖项

Microsoft.Extensions.Configuration.Abstractions 配置框架抽象包
Microsoft.Extensions.Configuration 实现包

二、重要对象


IConfigurationBuilder
IConfigurationSource
IConfigurationProvider


IConfiguration
IConfigurationRoot
IConfigurationSection

在这里插入图片描述


参考文章

1.IConfiguration

ConfigurationRoot、ConfigurationSection聚集于IConfiguration接口,此处也对这两个类进行讨论,方便我们对.NET Core的配置功能有个更加形象的印象。这两个接口,本质上就是.NET Core关于配置信息的读取方式。

ConfigurationSection继承于IConfigurationSection,该接口只有三个只读属性,分别表示配置信息的Key、Value以及路径信息,需要指出的是,此处的路径信息主要指从根节点到当前节点的路径,以表示当前节点的位置,类似于A:B:C可以表示节点C的位置,其中A、B、C都是ConfigurationSection的Key

该接口表示一组键/值应用程序配置属性,应用程序使用配置时的入口对象,.NET Core对其有多种扩展,其派生类包括位于统一类库的IConfigurationSection,以及Microsoft.Extensions.Configuration类库中的ConfigurationRoot、ConfigurationSection、IConfigurationRoot。我们可以通过DI获取IConfiguration实例。
它主要有以下三个方法:
GetChildren():获取直接子配置子节
GetReloadToken():返回一个IChangeToken,可用于确定何时重新加载配置
GetSection(String):获取指定键的子节点

配置的最终产出物,它代表了整个asp.net core应用的配置树,这棵树有根节点,子节点和叶子节点,根节点由IConfigurationRoot来表示,子节点由IConfigurationSection来表示,叶子节点则是由key value的键值对来表示的。

IConfiguration 接口:提供了查询、设置配置项、监控变化等方法。
IConfigurationRoot 接口:在IConfiguration接口基础上,增加了 Reload 方法强制从 provider 中重新加载配置值。
IConfigurationSection 接口:这是一个配置节,它可以位于配置根目录下的某个位置。它定义了一个 path 属性(到达该配置节所有父节的键的顺序组合)和一个 key 属性(自己的健)。

ConfigurationSection可以理解为针对指定配置节点下的配置信息,对IConfigurationRoot 进行相关的调用

IConfiguration,IConfigurationRoot : .Net Core中应用程序配置的操作接口,主要提供了对Json,xml,ini ,环境变量,内存数据等的读取功能。

IConfigurationRoot
//IConfigurationRoot是IConfiguration的一个子接口,一般用于读取自定义配置文件,
//也可用于读取AspNet Core的默认配置文件,但有点画蛇添足。

2.IConfigurationBuilder

它是IConfiguration的构造者,用于构建应用程序配置接口的构建器工具类。

builder 实例 : 我们向它添加配置提供器 provider。当我们需要时,我们只需要用它构建一个配置对象,它保存着从内存中加载的每个 provider 的所有值。
此配置对象能够透明地从添加的所有 provider 中返回设置信息,这意味着无论配置源是什么,我们都使用相同的语法来查询配置选项。 它加载所有注册的 provider 的注册项,并在内存中保存。你还可以在内存中更改或添加配置项。

ConfigurationBuilder 类本身只是 IConfigurationBuilder 接口的特定实现,此外没有其他的实现。 它约定了我们如何添加 provider 并从中构建配置对象:

var builder = new ConfigurationBuilder()
    .Add(source1)
    .Add(source2);
var cfg = builder.Build();

原文链接

3.IConfigurationSource

IConfigurationBuilder
IConfigurationProvider
IConfigurationSection

它表示IConfiguration中的一个个配置源,注册到IConfigurationBuilder中,形成一个IEnumerable列表。由于有不同的配置源,比如josn文件,环境变量,INI文件,XML文件,Console控制台等等,所以,需要有一个中间的源头参与,这个中间人就是key value键值对,能够产生这个键值对的类型是IConfigurationProvider。IConfigurationSource的build方法生成对应的IConfigurationProvider。

4.IConfigurationProvider

由IConfigurationSource生成。这个类型中定义了一些方法,都是用key来获取value的,也就是说基本都是操作字典的方法。

.Net Core 中的配置模型(即IConfiguration)是统一的,用户采用相同的方式获取所有不同类型的配置内容。实际上所有来源不同的 IConfigurationSource 都被转换成了 统一的键值对模型 供用户使用。而 IConfigurationProvider 就是使得不同配置源变得对用户透明的“中间商”。IConfigurationProvider 规定了配置项的获取、设置、重载等统一的行为,见它的签名

对于任何一个 IConfigurationSource, 必须要同时实现相应的 IConfigurationProvider 接口,才能被IConfigurationBuilder创建成统一的IConfiguration对象。

5. 配置对象是如何创建的

在 .Net Core 2.x 及以上版本中,IConfiguration 服务被框架自动注册到 DI 容器中了(见 IWebHostBuilder.Build()的实现)。我们可以直接通过 IServiceProvider 或者 构造函数 获取配置对象。那么配置对象是如何创建的呢?

一般而言,我们 首先创建 IConfigurationSource 对象,调用 IConfigurationBuilder 的 Add() 方法把创建的 source 注册到 builder 对象中,最后调用 IConfigurationBuilder 的 Build() 方法创建配置对象。Build方法做了如下工作

public IConfigurationRoot Build()
{
    var providers = new List<IConfigurationProvider>();
    foreach (var source in Sources)
    {
        var provider = source.Build(this);
        providers.Add(provider);
    }
    return new ConfigurationRoot(providers);
}

它使用所有注册的 source 创建一个 provider 集合,由于 provider 提供了统一的数据访问方式,因此就可以调用 ConfigurationRoot 的构造函数,在初始化 ConfigurationRoot 过程中,调用 provider的 Load()方法加载配置项 。

此外,对于常用的配置类型,还可以调用 IConfigurationBuilder 的一些对应的扩展方法来直接注册数据源,例如,可直接调用其AddJsonFile()扩展方法添加一个Json配置源。

5.总结

这四个核心对象之间的关系简单而清晰,完全可以通过一句话来概括:

  1. 提供一个实现了 IConfigurationProvider 接口的配置提供类,它需要提供配置的读取以及更新等操作
  2. 提供一个 IConfigurationSource 接口实现类,它负责创建 IConfigurationProvider 。
  3. 创建一个 IConfigurationBuilder 配置建造者对象,然后将 IConfigurationSource 添加进配置构造者中,这里我们一般都采用 IConfigurationBuilder 的拓展方法来实现。
  4. 使用 IConfigurationBuilder 构造一个 IConfigurationRoot ,然后使用这个 IConfigurationRoot 去操作配置。

在这里插入图片描述


在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习编程?其实不难,不过在学习编程之前你得先了解你的目的是什么?这个很重要,因为目的决定你的发展方向、决定你的发展速度。
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面设计类、前端与移动、开发与测试、营销推广类、数据运营类、运营维护类、游戏相关类等,根据不同的分类下面有细分了不同的岗位。
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生学习Java开发,但要结合自身的情况,先了解自己适不适合去学习Java,不要盲目的选择不适合自己的Java培训班进行学习。只要肯下功夫钻研,多看、多想、多练
Can’t connect to local MySQL server through socket \'/var/lib/mysql/mysql.sock问题 1.进入mysql路径
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 sqlplus / as sysdba 2.普通用户登录
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服务器有时候会断掉,所以写个shell脚本每五分钟去判断是否连接,于是就有下面的shell脚本。
BETWEEN 操作符选取介于两个值之间的数据范围内的值。这些值可以是数值、文本或者日期。
假如你已经使用过苹果开发者中心上架app,你肯定知道在苹果开发者中心的web界面,无法直接提交ipa文件,而是需要使用第三方工具,将ipa文件上传到构建版本,开...
下面的 SQL 语句指定了两个别名,一个是 name 列的别名,一个是 country 列的别名。**提示:**如果列名称包含空格,要求使用双引号或方括号:
在使用H5混合开发的app打包后,需要将ipa文件上传到appstore进行发布,就需要去苹果开发者中心进行发布。​
+----+--------------+---------------------------+-------+---------+
数组的声明并不是声明一个个单独的变量,比如 number0、number1、...、number99,而是声明一个数组变量,比如 numbers,然后使用 nu...
第一步:到appuploader官网下载辅助工具和iCloud驱动,使用前面创建的AppID登录。
如需删除表中的列,请使用下面的语法(请注意,某些数据库系统不允许这种在数据库表中删除列的方式):
前不久在制作win11pe,制作了一版,1.26GB,太大了,不满意,想再裁剪下,发现这次dism mount正常,commit或discard巨慢,以前都很快...
赛门铁克各个版本概览:https://knowledge.broadcom.com/external/article?legacyId=tech163829
实测Python 3.6.6用pip 21.3.1,再高就报错了,Python 3.10.7用pip 22.3.1是可以的
Broadcom Corporation (博通公司,股票代号AVGO)是全球领先的有线和无线通信半导体公司。其产品实现向家庭、 办公室和移动环境以及在这些环境...
发现个问题,server2016上安装了c4d这些版本,低版本的正常显示窗格,但红色圈出的高版本c4d打开后不显示窗格,
TAT:https://cloud.tencent.com/document/product/1340