NetCore配置详解(1)
NetCore配置
- 一、依赖项
- 二、重要对象
- 1.IConfiguration
- 2.IConfigurationBuilder
- 3.IConfigurationSource
- 4.IConfigurationProvider
- 5. 配置对象是如何创建的
- 5.总结
一、依赖项
Microsoft.Extensions.Configuration.Abstractions 配置框架抽象包
Microsoft.Extensions.Configuration 实现包
二、重要对象
IConfigurationBuilder
IConfigurationSource
IConfigurationProviderIConfiguration
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.总结
这四个核心对象之间的关系简单而清晰,完全可以通过一句话来概括:
- 提供一个实现了 IConfigurationProvider 接口的配置提供类,它需要提供配置的读取以及更新等操作
- 提供一个 IConfigurationSource 接口实现类,它负责创建 IConfigurationProvider 。
- 创建一个 IConfigurationBuilder 配置建造者对象,然后将 IConfigurationSource 添加进配置构造者中,这里我们一般都采用 IConfigurationBuilder 的拓展方法来实现。
- 使用 IConfigurationBuilder 构造一个 IConfigurationRoot ,然后使用这个 IConfigurationRoot 去操作配置。
NetCore配置详解(1)相关推荐
- elasticsearch-.yml(中文配置详解)
此elasticsearch-.yml配置文件,是在$ES_HOME/config/下 elasticsearch-.yml(中文配置详解) # ======================== El ...
- (ASA) Cisco Web ××× 配置详解 [三部曲之一]
(ASA) Cisco Web ××× 配置详解 [三部曲之一] 注意:本文仅对Web×××特性和配置作介绍,不包含SSL ×××配置,SSL ×××配置将在本版的后续文章中进行介绍. 首先,先来 ...
- mybatis 同名方法_MyBatis(四):xml配置详解
目录 1.我们将 数据库的配置语句写在 db.properties 文件中 2.在 mybatis-configuration.xml 中加载db.properties文件并读取 通过源码我们可以分析 ...
- logback节点配置详解
logback节点配置详解 一:根节点 <configuration></configuration> 属性 : debug : 默认为false ,设置为true时,将打印出 ...
- PM配置详解之一:企业结构
1.维护计划工厂 功能说明 在公司结构中定义维护工厂(通常已经作为后勤工厂存在)和维护计划工厂(简称计划工厂). 维护工厂:设备所安装的位置,如某机组安装在合营公司,那么合营公司就是此机组的维护工厂, ...
- 转 Log4j.properties配置详解
一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...
- Iptables防火墙配置详解
iptables防火墙配置详解 iptables简介 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表. (1)filter表负责过滤数 ...
- spring之旅第四篇-注解配置详解
spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...
- php-fpm 启动参数及重要配置详解
2019独角兽企业重金招聘Python工程师标准>>> php-fpm 启动参数及重要配置详解 约定几个目录 /usr/local/php/sbin/php-fpm /usr/loc ...
最新文章
- url 通配符解析成参数
- 前端面试被问到性能优化该肿么办!
- 编码之道:取个好名字很重要
- Android Training精要(六)如何防止Bitmap对象出现OOM
- 15947884 oracle_Oracle Patch Bundle Update
- HTML标记也可以乘坐标签,XHTML标签都有一个结束标记
- 培养创造性思维20个技巧
- 解决 elementUI 切换table后 el_table 固定列下方多了一条线
- 函数式编程学习之路(四)
- 给WP7初学者:《WP7 Dev Quick Start系列视频》
- mysql tx read only_DB为何大量出现select @@session.tx_read_only 详解
- VB C# 语法对比图 (代码实例)
- 处理在SBS2003上安装WSUS失败的情况
- 用linux运行vasp,科学网—VASP使用 - 李继存的博文
- 校验码(循环冗余校验码)
- IT前沿技术之node.js篇七:Node.js与HBase
- 解空间树及其相关算法
- 63 Defi过后,人生第一次玩DAO----超级君【2020-08-22 2234】
- 抛弃Eclipse,投入IDEA 的独孤求败江湖
- python如何调用谷歌搜图api_python如何调用百度识图api