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 去操作配置。

在这里插入图片描述


在这里插入图片描述

相关文章

学习编程是顺着互联网的发展潮流,是一件好事。新手如何学习...
IT行业是什么工作做什么?IT行业的工作有:产品策划类、页面...
女生学Java好就业吗?女生适合学Java编程吗?目前有不少女生...
Can’t connect to local MySQL server through socket \'/v...
oracle基本命令 一、登录操作 1.管理员登录 # 管理员登录 ...
一、背景 因为项目中需要通北京网络,所以需要连vpn,但是服...