asp.net core 2.0中的配置(1)---Configuration
配置就是一个装配数据字典的过程,一个字典也就是一个键值对,所以从配置就是键值对。
在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的更多相关文章
- 在ASP.NET Core 2.0中使用CookieAuthentication
在ASP.NET Core中关于Security有两个容易混淆的概念一个是Authentication(认证),一个是Authorization(授权).而前者是确定用户是谁的过程,后者是围绕着他们允 ...
- 如何在ASP.NET Core 2.0中使用Razor页面
如何在ASP.NET Core 2.0中使用Razor页面 DotNetCore2017-11-22 14:49 问题 如何在ASP.NET Core 2.0中使用Razor页面 解 创建一个空的项 ...
- asp.net core 3.0 中使用 swagger
asp.net core 3.0 中使用 swagger Intro 上次更新了 asp.net core 3.0 简单的记录了一下 swagger 的使用,那个项目的 api 比较简单,都是匿名接口 ...
- 探索 ASP.Net Core 3.0系列三:ASP.Net Core 3.0中的Service provider validation
前言:在本文中,我将描述ASP.NET Core 3.0中新的“validate on build”功能. 这可以用来检测您的DI service provider是否配置错误. 具体而言,该功能可检 ...
- 在Asp.Net Core 3.0中如何使用 Newtonsoft.Json 库序列化数据
在.Net Core 3.0中 内置了一套Json序列化/反序列化方案,默认可以不再依赖,不再支持 Newtonsoft.Json. 但是.NET Core 3.0 System.Text.Jso ...
- 探索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包含比以前版本更多的现成模板. 在本文中,我将 ...
- 避免在ASP.NET Core 3.0中为启动类注入服务
本篇是如何升级到ASP.NET Core 3.0系列文章的第二篇. Part 1 - 将.NET Standard 2.0类库转换为.NET Core 3.0类库 Part 2 - IHostingE ...
- asp.net core 5.0 中的 JsonConsole
asp.net core 5.0 中的 JsonConsole Intro asp.net core 5.0 中日志新增了 JsonConsole,还是输出日志到 Console,但是会应用 Json ...
- ASP.NET Core 1.0 中的依赖项管理
var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...
随机推荐
- 对Promise的理解?
ES6原生提供了promise对象 所谓Promise,就是一个对象,用来传递异步操作的消息.它代表了某个未来才会知道结果的事件(通过是一个异步操作),并且这个事件提供统一的API,可供进一步处理 P ...
- jQuery添加自定义函数的三种方法
原文链接:http://caibaojian.com/284.html 方法一: jQuery.fn.setApDiv=function () { //apDiv浮动层显示位置居中控制 var whe ...
- 移动App测试实战—专项测试
我们在进行了手工的功能测试之后,也开发了一些自动化测试用例,并且做了性能测试之后,测试工作看似比较完整了.但是当我们的App在大量的用户那里被安装和使用的时候,还是会有很多我们之前没有预料的问题 ...
- js删除数组元素、清空数组的简单方法
一.清空数组 ? 1 2 3 var ary = [1,2,3,4]; ary.splice(0,ary.length);//清空数组 console.log(ary); // 输出 [],空数组,即 ...
- linux mint软件安装
安装linux mint步骤请自行百度,这里略过....下载地址:https://www.linuxmint.com/edition.php?id=246文档下载:https://www.linuxm ...
- 网络流量状态命令总结 (含notp安装)
1. sar -n DEV 1 2 sar命令包含在sysstat工具包中,提供系统的众多统计数据.其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收 ...
- python:利用smtplib模块发送邮件
自动化测试中,测试报告一般都需要发送给相关的人员,比较有效的一个方法是每次执行完测试用例后,将测试报告(HTML.截图.附件)通过邮件方式发送. 参考代码:send_mail.py 一.python对 ...
- 《大道至简》第一章j愚公移山ava伪代码
<大道至简>第一章,将编程比作了愚公移山,完美的诠释了编程的整个过程.在两千年前的寓言中,愚公集项目组织者.团队经理.编程人员.技术分析师等众多角色于一身.首先是原始需求的产生:“惩山北之 ...
- 虚拟机vbox
https://www.virtualbox.org/wiki/Linux_Downloads 一直在报内核出错的问题,我尝试了各种方法还是无果,猜测是版本的问题,这里推荐各位安装virtualbox ...
- [Spark][Hive]外部文件导入到Hive的例子
外部文件导入到Hive的例子: [training@localhost ~]$ cd ~[training@localhost ~]$ pwd/home/training[training@local ...