[ASP.NET Core 3框架揭秘] 配置[6]:多样化的配置源[上篇]
.NET Core采用的这个全新的配置模型的一个主要的特点就是对多种不同配置源的支持。我们可以将内存变量、命令行参数、环境变量和物理文件作为原始配置数据的来源。如果采用物理文件作为配置源,我们可以选择不同的格式(比如XML、JSON和INI等)。如果这些默认支持的配置源形式还不能满足你的需求,我们还可以通过注册自定义IConfigurationSource的方式将其他形式数据作为配置来源。
一、MemoryConfigurationSource在之前的实例演示都在使用MemoryConfigurationSource来提供原始的配置。我们知道MemoryConfigurationSource配置源采用一个字典对象(具体来说应该是一个元素类型为KeyValuePair<string, string>的集合)作为存放原始配置数据的容器。作为一个IConfigurationSource对象,它总是通过创建某个对应的IConfigurationProvider对象来完成具体的配置数据读取工作,那么MemoryConfigurationSource会提供一个怎样的IConfigurationProvider呢?
public class MemoryConfigurationSource : IConfigurationSource { public IEnumerable<KeyValuePair<string, string>> InitialData { get; set; } public IConfigurationProvider Build(IConfigurationBuilder builder) => new MemoryConfigurationProvider(this); }
上面给出的代码片段体现了MemoryConfigurationSource的完整定义,我们可以看到它具有一个IEnumerable<KeyValuePair<string, string>>类型的属性InitialData来存放初始的配置数据。从Build方法的实现可以看出,真正被它用来读取原始配置数据的是一个MemoryConfigurationProvider类型的对象,该类型的定义如下面的代码片段所示。
public class MemoryConfigurationProvider : ConfigurationProvider, IEnumerable<KeyValuePair<string, string>> { public MemoryConfigurationProvider(MemoryConfigurationSource source); public void Add(string key, string value); public IEnumerator<KeyValuePair<string, string>> GetEnumerator(); IEnumerator IEnumerable.GetEnumerator(); }
从上面的代码片段可以看出,MemoryConfigurationProvider派生于抽象类ConfigurationProvider,,同时还实现了IEnumerable<KeyValuePair<string, string>>接口。我们知道ConfigurationProvider对象直接使用一个Dictionary<string, string>来保存配置数据,当我们根据一个MemoryConfigurationSource对象调用构造函数创建MemoryConfigurationProvider的时候,它只需要将通过InitialData属性保存的配置数据转移到这个字典中即可。MemoryConfigurationProvider还定义了一个Add方法使我们可以在任何时候都可以向配置字典中添加一个新的配置项。
通过前面对配置模型的介绍,我们知道IConfigurationProvider对象在配置模型中所起的作用就是读取原始的配置数据并将其转换成配置字典。在所有的预定义的IConfigurationProvider实现类型中,MemoryConfigurationProvider最为简单直接,因为它对应的配置源就是一个配置字典,所以根本不需要作任何的结构转换。
在利用MemoryConfigurationSource生成配置的时候,我们需要将它注册到IConfigurationBuilder对象之上。具体来说,我们可以像前面演示的实例一样直接调用IConfigurationBuilder接口的Add方法,也可以调用如下所示的两个重载的AddInMemoryCollection扩展方法。
public static class MemoryConfigurationBuilderExtensions { public static IConfigurationBuilder AddInMemoryCollection( this IConfigurationBuilder configurationBuilder); public static IConfigurationBuilder AddInMemoryCollection( this IConfigurationBuilder configurationBuilder, IEnumerable<KeyValuePair<string, string>> initialData); }
二、EnvironmentVariablesConfigurationSource顾名思义,环境变量就是描述当前执行环境并影响进程执行行为的变量。按照作用域的不同,我们将环境变量划分成三类,即分别针对当前系统、当前用户和当前进程的环境变量。对于Windows系统来说,系统和用户级别的环境变量保存在注册表中,其路径分别为“HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Control\Session Manager\Environment”和“HKEY_CURRENT_USER\Environment ”。
环境变量的提取和维护可以通过静态类型Environment来完成。具体来说,我们可以调用它的静态方法GetEnvironmentVariable获得某个指定名称的环境变量的值,而GetEnvironmentVariables方法则会返回所有的环境变量,EnvironmentVariableTarget枚举类型的参数代表环境变量作用域决定的存储位置。如果在调用GetEnvironmentVariable或者GetEnvironmentVariables方法时没有显式指定target参数或者将参数指定为EnvironmentVariableTarget.Process,在进程初始化前存在的所有环境变量(包括针对系统、当前用户和当前进程)将会作为候选列表。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/40005.html
- 上一篇:让你的网页抖起来?!?
- 下一篇:idea 编译 netty 源码