.NET Core采用的全新配置系统[5]: 聊聊默认支持的各种配置源[内
较之传统通过App.config和Web.config这两个XML文件承载的配置系统,.NET Core采用的这个全新的配置模型的最大一个优势就是针对多种不同配置源的支持。我们可以将内存变量、命令行参数、环境变量和物理文件作为原始配置数据的来源,如果采用物理文件作为配置源,我们可以选择不同的格式(比如XML、JSON和INI等) 。如果这些默认支持的配置源形式还不能满足你的需求,我们还可以通过注册自定义ConfigurationSource的方式将其他形式数据作为我们的配置来源。 [ 本文已经同步到《ASP.NET Core框架揭秘》之中]
一、内存变量从本被系列第一篇开始到现在,我们所有的实例演示一直都在使用MemoryConfigurationSource这种类型的ConfigurationSource来提供原始的配置。我们知道MemoryConfigurationSource采用一个字典对象(具体来说应该是一个元素类型为KeyValuePair<string,string>的集合)作为存放原始配置数据的容器。作为一个ConfigurationSource,它总是通过创建某个对应的ConfigurationProvider来从事具体的配置数据读取工作,那么MemoryConfigurationSource会提供一个怎样的ConfigurationProvider呢? 1: public class MemoryConfigurationSource : IConfigurationSource 2: {
3: public IEnumerable<KeyValuePair<string,string>> InitialData { get; set; } 4:?
5: public IConfigurationProvider Build(IConfigurationBuilder builder) 6: {
7: return new MemoryConfigurationProvider(this); 8: }
9: }
上面给出的代码片段体现了MemoryConfigurationSource的完整定义,我们可以看到它具有一个IEnumerable<KeyValuePair<string,string>>类型的属性InitialData来存放初始的配置数据。从Build方法的实现可以看出,真正被它用来读取原始配置数据的是一个MemoryConfigurationProvider类型的对象,该类型的定义如下面的代码片段所示。 public MemoryConfigurationProvider(MemoryConfigurationSource source);
public IEnumerator<KeyValuePair<string>> GetEnumerator();
7: } 从上面的代码片段可以看出,MemoryConfigurationProvider派生于抽象类ConfigurationProvider,同时还实现了IEnumerable<KeyValuePair<string,string>>接口。我们知道ConfigurationProvider直接使用一个Dictionary<string,string>来保存配置数据,当我们根据一个MemoryConfigurationSource对象调用构造函数创建MemoryConfigurationProvider的时候,它只需要将通过InitiateData属性保存的配置数据转移到这个字典中即可。MemoryConfigurationProvider还定义了一个Add方法是我们可以在任何时候都可以向配置字典中添加一个新的配置项。 通过前面对配置模型的介绍,我们知道ConfigurationProvider在配置模型中所起的作用就是读取原始的配置数据并将其转换成配置字典。在所有的预定义的ConfigurationProvider类型中,MemoryConfigurationProvider最为简单直接,因为它对应的配置源就是一个配置字典,所以根本不需要作任何的结构转换。 在利用MemoryConfigurationSource生成配置的时候,我们需要将它注册到ConfigurationBuilder之上。具体来说,我们可以像前面演示的实例一样直接调用ConfigurationBuilder的Add方法,也可以调用如下所示的了两个重载的扩展方法AddInMemoryCollection。 2: this IConfigurationBuilder configurationBuilder,1)">string>> initialData);
|
Arguments |
Switch Mapping |
/architecture x64 /runtime coreclr |
- |
--architecture x64 --runtime coreclr |
- |
architecture=x64 runtime=coreclr |
- |
--a x64 --r coreclr |
--a: architecture,--r: runtime |
-a x64 -r coreclr |
-a: architecture,-r: runtime |
原始的命令行参数总是体现为一个字符串数组, CommandLineConfigurationSource以字符串数组作为配置源,并利用对应的ConfigurationProvider将它转换成配置字典。如下面的代码片断所示,CommandLineConfigurationSource具有Args和SwitchMappings,前者正式代表承载着原始命令行参数的字符串数组,后者则保存了命令行开关的缩写与全称之间的映射关系。在实现的Build方法中,它根据这两个属性创建出一个CommandLineConfigurationProvider对象。
7: {
9: }
class CommandLineConfigurationProvider : ConfigurationProvider
public CommandLineConfigurationProvider(IEnumerable<string> args,IDictionary<string> switchMappings = null);
6: }
在采用基于命令行参数作为配置源的时候,我们可以创建一个CommandLineConfigurationSource并将其注册到ConfigurationBuilder之上。我们也可以调用IConfigurationBuilder接口的如下两个扩展方法AddCommandLine将两个步骤合二为一。
为了让读者朋友们对CommandLineConfigurationProvider解析命令行参数采用的策略具有一个深刻的认识,我们来演示一个简单的实例。我们创建一个控制台应用,并添加针对 “Microsoft.Extensions.Configuration.CommandLine”这个NuGet包的依赖。在Main方法中,我们编写了如下一段简单的实例程序。
5: Console.Write("Enter command line switches:");
7: Dictionary<string> mapping = string>
9: ["--a"] = "architecture ",1)"> 10: ["-a"] = 11: ["--r"] = "runtime",1)"> 12: ["-r"] = 13: };
),mapping)
17:?
19: {
20: Console.WriteLine($"{section.Key}: {section.Value}");
21: }
22: }
23: catch(Exception ex)
24: {
25: Console.WriteLine(ex.Message);
26: }
27: }
如上面的代码片断所示,我们在一个无限循环中接收用户指定的命令行参数,并据此创建一个CommandLineConfigurationSource对象并将其注册到ConfigurationBuilder之上。我们在创建这个CommandLineConfigurationSource对象的时候,还指定一个表示命令行开关映射关系的字典。接下来我们利用这个ConfigurationBuilder生成一个Configuration对象,并将其所有子配置节的Key和Value打印出来。我们运行该程序后分别采用上述五种方式提供了命令行参数,根据如下所示的输出结果,会发现解析命令行参数生成的配置是完全等效的。
(编辑:李大同)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
- asp.net-mvc – 如何在本地化的文本中嵌入链接
- 我想学习ASP.Net 2.0 / 3.5 / 4.0我应该从ASP.Net 2.0开始,
- asp.net – 从一个区域的操作重定向到“根”区域中的操作?
- ASP.NET MVC卷曲等效
- asp.net-mvc – ASP.NET MVC:三态复选框
- asp.net-mvc – 我应该在ASP.NET MVC3中附加自定义用户上下
- asp.net-mvc-3 – 在App_code文件夹中使用razor @helper使用
- asp.net – Excel单元格对齐:例如,数值xlLeft,xlRight还是
- asp.net – 在离开Gridview页面后维护GridView当前页面索引
- asp.net-mvc – 如何编写C#Extension方法将Domain Model对象
- asp.net-mvc – 存储网站图像的最佳方式
- asp.net – App_Start文件夹在ASP 4.5仅在WebApp
- ASP.NET 将字节大小转换为适合阅读的格式M,G,T
- asp.net-mvc – Telerik MVC网格大师详细级联下拉
- asp.net – 更新面板PostBackTrigger,更新进度不
- asp.net-mvc – 使用与状态模式合并的域模型
- asp.net-web-api – asp.net web api self hosti
- EF Core 数据变更自动审计设计
- asp.net-mvc – SOA vs MVC – 何时使用
- asp.net – 使用asp:Button将参数传递给函数