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.总结

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

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


NetCore配置详解(1)相关推荐

  1. elasticsearch-.yml(中文配置详解)

    此elasticsearch-.yml配置文件,是在$ES_HOME/config/下 elasticsearch-.yml(中文配置详解) # ======================== El ...

  2. (ASA) Cisco Web ××× 配置详解 [三部曲之一]

    (ASA) Cisco Web ××× 配置详解 [三部曲之一] 注意:本文仅对Web×××特性和配置作介绍,不包含SSL ×××配置,SSL ×××配置将在本版的后续文章中进行介绍.   首先,先来 ...

  3. mybatis 同名方法_MyBatis(四):xml配置详解

    目录 1.我们将 数据库的配置语句写在 db.properties 文件中 2.在 mybatis-configuration.xml 中加载db.properties文件并读取 通过源码我们可以分析 ...

  4. logback节点配置详解

    logback节点配置详解 一:根节点 <configuration></configuration> 属性 : debug : 默认为false ,设置为true时,将打印出 ...

  5. PM配置详解之一:企业结构

    1.维护计划工厂 功能说明 在公司结构中定义维护工厂(通常已经作为后勤工厂存在)和维护计划工厂(简称计划工厂). 维护工厂:设备所安装的位置,如某机组安装在合营公司,那么合营公司就是此机组的维护工厂, ...

  6. 转 Log4j.properties配置详解

    一.Log4j简介 Log4j有三个主要的组件:Loggers(记录器),Appenders (输出源)和Layouts(布局).这里可简单理解为日志类别,日志要输出的地方和日志以何种形式输出.综合使 ...

  7. Iptables防火墙配置详解

    iptables防火墙配置详解 iptables简介 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表. (1)filter表负责过滤数 ...

  8. spring之旅第四篇-注解配置详解

    spring之旅第四篇-注解配置详解 一.引言 最近因为找工作,导致很长时间没有更新,找工作的时候你会明白浪费的时间后面都是要还的,现在的每一点努力,将来也会给你回报的,但行好事,莫问前程!努力总不会 ...

  9. php-fpm 启动参数及重要配置详解

    2019独角兽企业重金招聘Python工程师标准>>> php-fpm 启动参数及重要配置详解 约定几个目录 /usr/local/php/sbin/php-fpm /usr/loc ...

最新文章

  1. url 通配符解析成参数
  2. 前端面试被问到性能优化该肿么办!
  3. 编码之道:取个好名字很重要
  4. Android Training精要(六)如何防止Bitmap对象出现OOM
  5. 15947884 oracle_Oracle Patch Bundle Update
  6. HTML标记也可以乘坐标签,XHTML标签都有一个结束标记
  7. 培养创造性思维20个技巧
  8. 解决 elementUI 切换table后 el_table 固定列下方多了一条线
  9. 函数式编程学习之路(四)
  10. 给WP7初学者:《WP7 Dev Quick Start系列视频》
  11. mysql tx read only_DB为何大量出现select @@session.tx_read_only 详解
  12. VB C# 语法对比图 (代码实例)
  13. 处理在SBS2003上安装WSUS失败的情况
  14. 用linux运行vasp,科学网—VASP使用 - 李继存的博文
  15. 校验码(循环冗余校验码)
  16. IT前沿技术之node.js篇七:Node.js与HBase
  17. 解空间树及其相关算法
  18. 63 Defi过后,人生第一次玩DAO----超级君【2020-08-22 2234】
  19. 抛弃Eclipse,投入IDEA 的独孤求败江湖
  20. python如何调用谷歌搜图api_python如何调用百度识图api

热门文章

  1. 宝德服务器bmc默认账号密码,宝德服务器系统管理平台用户操作手册.pdf
  2. 用户和用户组变成了数字
  3. 掷多个骰子取最大值为结果,求结果的期望值
  4. 在画电路图时,想问下几种地之间的区别? power-GND singal-GND GND
  5. 100多万个视频短片数据集来啦!
  6. 【合泰HT32F52352GPTM多路PWM控制】
  7. 学软件开发的理由_成为软件开发人员的8个理由
  8. rk3568 适配摄像头 (双摄)
  9. 深度学习、神经网络、机器学习区分【初入科研的释疑】
  10. ESP8266、ESP32和STM32的对比