配置就是一个装配数据字典的过程,一个字典也就是一个键值对,所以从配置就是键值对。

在asp.net core中关于配置是由四个基本的类型来支撑的,是①IConfigurationSource②IConfigurationProvider③IConfigurationBuilder④IConfiguration。

最终我们在程序中使用的是IConfiguration这个类型来获取配置中存入的信息,其他三个类型都是在asp.net core的启动过程中来帮助完成这个IConfiguration类型的。IConfigurationRoot这个接口继承IConfiguration接口,可以看作是一个东西(我现在的只是水平)。

具体过程是这样的:

IConfigurationBuilder这个类有一个Builder方法,在ICOnfigurationBuilder这个默认实现类ConfigurationBuilder:

 public class ConfigurationBuilder : IConfigurationBuilder
{
/// <summary>
/// Returns the sources used to obtain configuration values.
/// </summary>
public IList<IConfigurationSource> Sources { get; } = (IList<IConfigurationSource>) new List<IConfigurationSource>(); /// <summary>
/// Gets a key/value collection that can be used to share data between the <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder" />
/// and the registered <see cref="T:Microsoft.Extensions.Configuration.IConfigurationProvider" />s.
/// </summary>
public IDictionary<string, object> Properties { get; } = (IDictionary<string, object>) new Dictionary<string, object>(); /// <summary>Adds a new configuration source.</summary>
/// <param name="source">The configuration source to add.</param>
/// <returns>The same <see cref="T:Microsoft.Extensions.Configuration.IConfigurationBuilder" />.</returns>
public IConfigurationBuilder Add(IConfigurationSource source)
{
if (source == null)
throw new ArgumentNullException(nameof (source));
this.Sources.Add(source);
return (IConfigurationBuilder) this;
} /// <summary>
/// Builds an <see cref="T:Microsoft.Extensions.Configuration.IConfiguration" /> with keys and values from the set of providers registered in
/// <see cref="P:Microsoft.Extensions.Configuration.ConfigurationBuilder.Sources" />.
/// </summary>
/// <returns>An <see cref="T:Microsoft.Extensions.Configuration.IConfigurationRoot" /> with keys and values from the registered providers.</returns>
public IConfigurationRoot Build()
{
List<IConfigurationProvider> configurationProviderList = new List<IConfigurationProvider>();
foreach (IConfigurationSource source in (IEnumerable<IConfigurationSource>) this.Sources)
{
IConfigurationProvider configurationProvider = source.Build((IConfigurationBuilder) this);
configurationProviderList.Add(configurationProvider);
}
return (IConfigurationRoot) new ConfigurationRoot((IList<IConfigurationProvider>) configurationProviderList);
}
}

有两个关键的地方比较重要:

一个是:

 public IList<IConfigurationSource> Sources { get; } = (IList<IConfigurationSource>) new List<IConfigurationSource>();

这个list维护一个IConfigurationSource的集合,IConfigurationSource有一个Build方法来生成IConfigurationProvider,后面再说。

另一个是:

public IConfigurationRoot Build()
{
List<IConfigurationProvider> configurationProviderList = new List<IConfigurationProvider>();
foreach (IConfigurationSource source in (IEnumerable<IConfigurationSource>) this.Sources)
{
IConfigurationProvider configurationProvider = source.Build((IConfigurationBuilder) this);
configurationProviderList.Add(configurationProvider);
}
return (IConfigurationRoot) new ConfigurationRoot((IList<IConfigurationProvider>) configurationProviderList);
}

Build方法最终就是产生一个IConfigurationRoot类型。看一下里面的构造:

首先定义一个List装IConfigurationProvider的集合,然后遍历source集合,在遍历的逻辑内部将每一个IConfigurationSource转换为ConfigurationProvider之后装入这个IConfigurationProvider的list中,最后,再用这个list去初始化一个IConfigurationRoot。到此,我们就可以用DI来获取这个类型来找到我们想要的配置项了。

需要注意的是不同的配置源都有相应的类型的IConfigurationSource和IConfigurationProvider,比如:JsonConfigurationProvider和JsonConfigurationSource,这两个是用来配置json数据配置文件的,还有关于命令行的,环境变量的,等等,都是类似的,在学习源码的时候,多看一下就是了。

asp.net core 2.0中的配置(1)---Configuration的更多相关文章

  1. 在ASP.NET Core 2.0中使用CookieAuthentication

    在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...

  2. 如何在ASP.NET Core 2.0中使用Razor页面

    如何在ASP.NET Core 2.0中使用Razor页面  DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...

  3. asp.net core 3.0 中使用 swagger

    asp.net core 3.0 中使用 swagger Intro 上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用,那个项目的 api 比较简单,都是匿名接口 ...

  4. 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation

    前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...

  5. 在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据

    在.Net Core 3.0中 内置了一套Json序列化/反序列化方案,默认可以不再依赖,不再支持   Newtonsoft.Json. 但是.NET Core 3.0 System.Text.Jso ...

  6. 探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs

    原文:探索ASP.Net Core 3.0系列二:聊聊ASP.Net Core 3.0 中的Startup.cs 前言:.NET Core 3.0 SDK包含比以前版本更多的现成模板. 在本文中,我将 ...

  7. 避免在ASP.NET Core 3.0中为启动类注入服务

    本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...

  8. asp.net core 5.0 中的 JsonConsole

    asp.net core 5.0 中的 JsonConsole Intro asp.net core 5.0 中日志新增了 JsonConsole,还是输出日志到 Console,但是会应用 Json ...

  9. ASP.NET Core 1.0 中的依赖项管理

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

随机推荐

  1. OCX ACTIVEX程序打包个人精典案例(OCX)

  2. 1094 和为k的连续区间(暴力)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题 收藏 关注 一整数数列a1, a2, ... , an(有正有负),以及另一个整数k,求一个区间[i, j],(1 ...

  3. E - Matrix Power Series (矩阵数列)

    然后,怎么来求这个前k项的和,我把式子推一下 当k为奇数的时候直接SK-1+AK  就又化为偶数的情况了.代码如下: #include<iostream> #include<cstr ...

  4. PHP开发小技巧③—实现多维数组转化为一维数组

    在平常的项目开发中我们多会用到让多维数组转化为一维数组的情况,但是很多Programmer不会将其进行转化,也有些没有想到很好的算法然后经过乱起八糟的运算方式将其勉强转化好,但是所写的程序代码冗余非常 ...

  5. 对node.js的理解?

    a.Node.js是一个基于Google Chrome V8引擎的javascript运行环境.Node.js使用了一个事件驱动.非阻塞式I/O的模型,使其轻量又高效.Node.js的包管理器npm, ...

  6. 【Java123】Java基础知识点

    https://github.com/xbox1994/2018-Java-Interview 虽说不为面试做准备,仅仅就工作中遇到的很多Java问题,总是模棱两可的擦肩而过,真不是自己的风格. 还是 ...

  7. 吴恩达机器学习CS229课程笔记学习

    监督学习(supervised learning) 假设我们有一个数据集(dataset),给出居住面积和房价的关系如下: 我们以居住面积为横坐标,房价为纵坐标,组成数据点,如(2104, 400), ...

  8. 用Qt程序打开.txt 文件的时候,出现乱码的情况

    打开*.txt 文件出现乱码的情况,说明编码格式不对,一般的Windows下创建的txt 文件,到ubuntu 系统中打开会出现乱码的情况, 下面的代码读取文件,并且转化编码格式 void MainW ...

  9. elasticsearch6.1 安装问题

    问题:Caused by: java.lang.RuntimeException: can not run elasticsearch as root [root@localhost logs]# a ...

  10. 为什么建议php字符串使用单引号而不是双引号

    不少php提升效率的tip,都有提到字符串使用单引号,这是为什么呢? 因为在单引号中,php直接认为它里头包含的就是个字符串.而双引号时,php会检测里头是否包含变量.这样如果是纯粹的字符串的话,双引 ...