我们在本篇文章中会介绍三种针对物理文件的ConfiguationProvider,它们分别是针对JSON文件的JsonConfiguationProvider,针对XML文件的XmlConfiguationProvider以及针对INI文件的IniConfiguationProvider。对于这三种文件类型(JSON、XML和INI)来说,JSON能够采用简单直观的格式表示具有不同结构的数据,所以它是作为配置好的选择。
  目录
  MemoryConfigurationProvider
  EnvironmentVariablesConfigurationProvider
  CommandLineConfigurationProvider
  JsonConfigurationProvider
  XmlConfiguationProvider
  IniConfigurationProvider
  自定义ConfigurationProvider
  一、JsonConfiguationProvider
  我们可以将配置定义在一个JSON文件中,终利用JsonConfiguationProvider加载该文件并将以JSON格式表示的配置原始数据转换成配置字典供配置模型使用。JsonConfiguationProvider定义在“Microsoft.Extensions.Configuration.Json”程序集下,它同样也是所在NuGet包的名称。
  1: public class JsonConfigurationProvider : ConfigurationProvider
  2: {
  3:     public JsonConfigurationProvider(string path);
  4:     public JsonConfigurationProvider(string path, bool optional);
  5:
  6:     public override void Load();
  7:
  8:     public string    Path { get; }
  9:     public bool      Optional { get; }
  10: }
  如上面的代码片断所示,JsonConfiguationProvider具有两个只读属性(Path和Optional),前者代表承载原始配置数据的JSON文件所在路径,后者表明当前的JsonConfiguationProvider是否是可选的ConfigurationProvider,其默认值为False。如果Optional为True,在创建JsonConfiguationProvider是指定一个不存在的文件将不会抛出异常,在这种情况下它会创建一个空的字典对象作为配置源。
  在使用JsonConfiguationProvider的时候,我们可以直接创建这个对象并调用Add方法将其添加到指定的ConfigurationBuilder之中。我们可以直接调用ConfigurationBuilder对象具有如下定义的两个扩展方法AddJsonFile达到相同的目的。
  1: public static class JsonConfigurationExtensions
  2: {
  3:     public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder configurationBuilder, string path);
  4:     public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder configurationBuilder, string path, bool optional);
  5: }
  当使用JSON文件来定义配置的时候,我们会发现不论对于何种数据结构(复杂对象、集合户者字典),我们都能通过JSON格式以一种简单而自然的方式来定义它们。同样以前面定义的Profile类型为例,我们可以利用如下所示的三个JSON文件分别定义一个完整的Profile对象、一个Profile对象的集合以及一个Key和Value类型分别为字符串和Profile的字典。
  Profile.json
  1: {
  2:   "profile": {
  3:     "gender"  : "Male",
  4:     "age"     : "18",
  5:     "contactInfo": {
  6:       "email"        : "foobar@outlook.com",
  7:       "phoneNo"      : "123456789"
  8:     }
  9:   }
  10: }
  ProfileCollection.json
1: {
2:   "profiles": [
3:     {
4:       "gender"       : "Male",
5:       "age"          : "18",
6:       "contactInfo": {
7:         "email"      : "foo@outlook.com",
8:         "phoneNo"    : "123"
9:       }
10:     },
11:     {
12:       "gender" : "Male",
13:       "age"   : "25",
14:       "contactInfo": {
15:         "email"      : "bar@outlook.com",
16:         "phoneNo"    : "456"
17:       }
18:     },
19:     {
20:       "gender" : "Female",
21:       "age"   : "40",
22:       "contactInfo": {
23:         "email"      : "baz@outlook.com",
24:         "phoneNo"    : "789"
25:       }
26:     }
27:   ]
28: }