Asp.Net Core- 配置组件详解
我们之前写的配置都是放置在配置文件Web.config或者app.config中,.net core提供了全新的配置方式,可以直接写在内存中或者写在文件中。
.Net Core的配置API主要体现在3个类中Configuration、ConfigurationBuilder、ConfigurationProvider中。
配置文件其实就是一个键值对。Configuration以树形结构描述了这些键值对之间的关系。我们的配置文件比如project.json是怎么转换成Configuration树形结构的呢?
Microsoft.Extensions.Options这个命名空间下的类提供了文件向Configuration的转换。
一、配置文件分为3种结构
1. 逻辑结构:就是我们看到的结构,树形结构。
2. 原始结构:就是文件本身的结构,比如xml、json等等。
3. 物理结构:介于两者之间的结构,键值对。
配置组件的最终目的就是把原始结构转化成逻辑结构,在具体转换过程中,先找到对应的ConfigurationProvider转化为物理结构数据字典,然后再由ConfigurationBuilder转化为逻辑结构Configuration对象。
二、Configuration
Configuration对象泛指继承自接口IConfiguration的对象。这个接口如下:
namespace Microsoft.Extensions.Configuration
{
using Microsoft.Extensions.Primitives;
using System;
using System.Collections.Generic;
using System.Reflection;
public interface IConfiguration
{
IEnumerable<IConfigurationSection> GetChildren();
IChangeToken GetReloadToken();
IConfigurationSection GetSection(string key);
string this[string key] { get; set; }
}
}
这个接口GetChildren表示所有的ConfigurationSection对象;GetSection根据key值得到ConfigurationSection对象。
继承自这个接口的对象分别是ConfigurationRoot和ConfigurationSection,分别表示配置的根节点和叶子节点。

ConfigurationRoot还继承自接口IConfigurationRoot接口,代码如下:
namespace Microsoft.Extensions.Configuration
{
using System;
public interface IConfigurationRoot : IConfiguration
{
void Reload();
}
}
这个接口只有一个方法Reload重新加载,当调用这个方法的时候,在这棵树下的所有的节点都会重新加载。
ConfigurationSection还继承自IConfigurationSection,代码如下:
namespace Microsoft.Extensions.Configuration
{
using System;
public interface IConfigurationSection : IConfiguration
{
string Key { get; }
string Path { get; }
string Value { get; set; }
}
}
Key表示父节点的名称;Path表示当前节点的路径,用“:”隔开;Value只有在叶子节点才有值,非叶子节点返回Null。
三、ConfigurationProvider
ConfigurationProvider对象泛指实现了接口IConfigurationProvider的对象。
namespace Microsoft.Extensions.Configuration
{
using Microsoft.Extensions.Primitives;
using System;
using System.Collections.Generic;
using System.Runtime.InteropServices;
public interface IConfigurationProvider
{
IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath);
IChangeToken GetReloadToken();
void Load();
void Set(string key, string value);
bool TryGet(string key, out string value);
}
}
而继承自这个接口的是一个抽象类ConfigurationProvider,代码如下:
public abstract class ConfigurationProvider : IConfigurationProvider
{
// Fields
private ConfigurationReloadToken _reloadToken;
// Methods
protected ConfigurationProvider();
public virtual IEnumerable<string> GetChildKeys(IEnumerable<string> earlierKeys, string parentPath);
public IChangeToken GetReloadToken();
public virtual void Load();
protected void OnReload();
private static string Segment(string key, int prefixLength);
public virtual void Set(string key, string value);
public virtual bool TryGet(string key, out string value);
// Properties
protected IDictionary<string, string> Data { get; set; }
}
因为这个类的最终目的就是转化为数据字典,所以,这个类的方法大部分都是针对数据字典,方法的参数中都有key值。
不同的数据源都是继承自这个抽象类,重写自己的方法。
Load方法从数据源加载数据,针对不同的数据源子类可以重写;TryGet根据key值获取数据值;Set方法设置数据值,因为这个类的主要功能是从数据源读取数据转化为数据字典,所以Set的值只保存在内存中。
四、ConfigurationBuilder
泛指实现了接口IConfigurationBuilder的对象。他的作用就是根据ConfigurationProvider提供的数据字典,把数据字典转化为ConfigurationRoot对象。接口如下:
namespace Microsoft.Extensions.Configuration
{
using System.Collections.Generic;
public interface IConfigurationBuilder
{
IConfigurationBuilder Add(IConfigurationSource source);
IConfigurationRoot Build();
Dictionary<string, object> Properties { get; }
IEnumerable<IConfigurationSource> Sources { get; }
}
}
主要通过Build方法实现把数据字典转化为ConfigurationRoot。
无论是ConfigurationRoot还是ConfigurationSection本身都没有封装任何形式的对配置的读取操作,所有的读取操作都是在ConfigurationProvider对象中。
在ConfigurationRoot和ConfigurationSection组成的树形结构中,并没有在代码中直接保存这种结构,而是每个ConfigurationSection中都有一个ConfigurationRoot对象,直接是对根节点的引用。而只有根节点中有对ConfigurationProvider的调用。也就是在每个叶子节点中都有一个对于根节点的引用。这样当我们想要获取某个节点的具体值时,先找到根节点,再通过根节点找到ConfigurationProvider,通过ConfigurationProvider对象获取配置值。
还有一个对象ConfigurationPath,主要封装对树层级结构的计算,代码如下:
namespace Microsoft.Extensions.Configuration
{
using System;
using System.Collections.Generic;
public static class ConfigurationPath
{
public static readonly string KeyDelimiter = ":";
public static string Combine(IEnumerable<string> pathSegments)
{
if (pathSegments == null)
{
throw new ArgumentNullException("pathSegments");
}
return string.Join(KeyDelimiter, pathSegments);
}
public static string Combine(params string[] pathSegments)
{
if (pathSegments == null)
{
throw new ArgumentNullException("pathSegments");
}
return string.Join(KeyDelimiter, pathSegments);
}
public static string GetParentPath(string path)
{
if (!string.IsNullOrEmpty(path))
{
int length = path.LastIndexOf(KeyDelimiter, (StringComparison) StringComparison.OrdinalIgnoreCase);
if (length != -)
{
return path.Substring(, length);
}
}
return null;
}
public static string GetSectionKey(string path)
{
if (!string.IsNullOrEmpty(path))
{
int num = path.LastIndexOf(KeyDelimiter, (StringComparison) StringComparison.OrdinalIgnoreCase);
if (num != -)
{
return path.Substring(num + );
}
}
return path;
}
}
}
Combine方法实现把路径连接成一个完整的路径。
以上对象之间的关系图如下:

综上,配置模块的最终目的是要把原始的配置文件比如:json、xml转换为一个ConfigurationRoot对象,这个对象是一个树形结构,下边是ConfigurationSection对象。当我们要获取某个配置时,通过ConfigurationRoot的ConfigurationProvider获取,每个ConfigurationSection都有一个对于根节点的引用。
后记:当需要读取一个配置文件的时候,调用ConfigurationBuilder的build方法把文件内容转换为ConfigurationRoot对象,在这个方法执行过程中,会调用根据配置文件的不同调用相关的ConfigurationProvider ,然后调用ConfigurationProvider的Load方法,把配置文件转换成数据字典;然后再回到ConfigurationBuilder中把数据字典转化为ConfigurationRoot。
参考链接:http://www.cnblogs.com/artech/p/asp-net-core-config-01.html
Asp.Net Core- 配置组件详解的更多相关文章
- 【转】asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境 ...
- ASP.NET Core真实管道详解[2]:Server是如何完成针对请求的监听、接收与响应的【上】
Server是ASP .NET Core管道的第一个节点,负责完整请求的监听和接收,最终对请求的响应同样也由它完成.Server是我们对所有实现了IServer接口的所有类型以及对应对象的统称,如下面 ...
- ASP.NET Core真实管道详解[1]:中间件是个什么东西?
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解 (转载)
“传导体” HttpContext 要理解 HttpContext 是干嘛的,首先,看图 图一 内网访问程序 图二 反向代理访问程序 ASP.NET Core 程序中,Kestrel 是一个基于 li ...
- asp.net core环境变量详解
环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的环境变量在其它文件里面,不多说了,有兴趣的 ...
- ASP.NET Core 中 HttpContext 详解与使用 | Microsoft.AspNetCore.Http 详解
笔者没有学 ASP.NET,直接学 ASP.NET Core ,学完 ASP.NET Core MVC 基础后,开始学习 ASP.NET Core 的运行原理.发现应用程序有一个非常主要的 “传导体” ...
- ASP.NET Core真实管道详解[1]
ASP.NET Core管道虽然在结构组成上显得非常简单,但是在具体实现上却涉及到太多的对象,所以我们在 <ASP.NET Core管道深度剖析[共4篇]> 中围绕着一个经过极度简化的模拟 ...
- net core体系-web应用程序-4net core2.0大白话带你入门-5asp.net core环境变量详解
asp.net core环境变量详解 环境变量详解 Windows操作系统的环境变量在哪设置应该都知道了. Linux(centos版本)的环境变量在/etc/profile里面进行设置.用户级的 ...
- ASP.NET Core的配置(2):配置模型详解
在上面一章我们以实例演示的方式介绍了几种读取配置的几种方式,其中涉及到三个重要的对象,它们分别是承载结构化配置信息的Configuration,提供原始配置源数据的ConfigurationProvi ...
- Tomcat系列之服务器的安装与配置以及各组件详解
Tomcat系列之服务器的安装与配置以及各组件详解 大纲 一.前言 二.安装与配置Tomcat 三.Tomcat 目录的结构 四.Tomcat 配置文件 注,本文的测试的操作系统为CentOS 6.4 ...
随机推荐
- Task的使用
在.net4.0的时候推出的Task using System; using System.Threading; using System.Threading.Tasks; namespace Tas ...
- linux 进程间消息队列通讯
转自:http://blog.csdn.net/lifan5/article/details/7588529 http://www.cnblogs.com/kunhu/p/3608589.html 前 ...
- poj1151Atlantis(离散化+扫描线)
http://poj.org/problem?id=1151 http://www.cnblogs.com/kane0526/archive/2013/02/26/2934214.html这篇博客写的 ...
- bzoj4511: [Usaco2016 Jan]Subsequences Summing to Sevens
前缀和. 设f[i]为前缀和%7=i的第一个点.那么答案就是max(i-f[s[i]%7])了. #include<cstdio> #include<algorithm> #i ...
- Cacti 'graph_xport.php' SQL注入漏洞
漏洞版本: Cacti < 0.8.8b 漏洞描述: Bugtraq ID:66555 Cacti是一套基于PHP,MySQL,SNMP及RRDTool开发的网络流量监测图形分析工具. Cact ...
- C#中哈希表与List的比较
简单概念 在c#中,List是顺序线性表(非链表),用一组地址连续的存储单元依次存储数据元素的线性结构. 哈希表也叫散列表,是一种通过把关键码值映射到表中一个位置来访问记录的数据结构.c#中的哈希表有 ...
- TreeView点击父节点不刷新展开子节点
1.设置TreeView的属性EnableClientScript=true: 2.在动态绑定TreeView时,设置Node的属性SelectAction为Expand newNode. ...
- shape的属性
<?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http: ...
- po 时不生效时, 不要用点方法
Dot notation for message sending is not supported in lldb. Use bracket notation and cast the result ...
- 31、activity 四种工作模式
一个应用通常(不一定)对应一个任务栈,相当于有个集合,保存了这个app里所有的页面栈的规则是先进后出,"进"就相当于打开了一个页面,"出"就相当于返回时关闭一个 ...