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= ...
随机推荐
- BZOJ1006:[HNOI2008]神奇的国度(弦图染色)
Description K国是一个热衷三角形的国度,连人的交往也只喜欢三角原则.他们认为三角关系:即AB相互认识,BC相互认识,CA相互认识,是简洁高效的. 为了巩固三角关系,K国禁止四边关系,五边关 ...
- Spring Component注解处理过程
接下来: org.springframework.context.annotation.ComponentScanBeanDefinitionParser#parse方法展开加载过程:
- Linux系统学习之网络管理
网络接口配置 使用ifconfig检查和配置网卡 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ...
- java static 在java 中的使用。
static表示“全局”或者“静态”的意思,用来修饰成员变量和成员方法,也可以形成静态static代码块,但是Java语言中没有全局变量的概念. 被static修饰的成员变量和成员方法独立于该类的任何 ...
- VS诊断工具打开失败
使用管理员模式打开cmd,输入以下命令~ C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis -iC:\Windows\Micros ...
- item 11: 比起private undefined function优先使用deleted function
本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 如果你为其他开发者提供代码,并且你想阻止他们调用一个特定的函数,你 ...
- 将 C# 枚举序列化为 JSON 字符串 基础理论
该转换过程需要引用 Newtonsoft.JSON,这其中的转换过程还是蛮有意思的. 一.定义枚举 /// <summary> /// 托寄物品枚举 /// </summary> ...
- [朴孝敏][Ooh La La]
歌词来源:http://music.163.com/#/song?id=484058960 作曲 : Damon Sharpe/Jimmy Burney/Adam Kapit [作曲 : Damon ...
- Nginx 负载均衡的Cache缓存批量清理的操作记录
1)nginx.conf配置 [root@inner-lb01 ~]# cat /data/nginx/conf/nginx.conf user www; worker_processes 8; #e ...
- systemctl添加开机启动
我们对service和chkconfig两个命令都不陌生,systemctl 是管制服务的主要工具, 它整合了chkconfig 与 service功能于一体. systemctl is-enable ...