.NET Core开发之配置详解

2019-12-30 19:50:46王旭

有了ConfigurationRoot对象后,获取配置信息的操作就很简单了。遍历各个ConfigurationProvider,从中获取第一个匹配键值的数据。


public string this[string key]
{
  get
  {
    foreach (var provider in _providers.Reverse())
    {
      string value;

      if (provider.TryGet(key, out value))
      {
        return value;
      }
    }

    return null;
  }

  ...
}

ConfigurationProvider对象从Data属性获取配置的值。


public virtual bool TryGet(string key, out string value)
  => Data.TryGetValue(key, out value);

在最初的例子中可以看Configuration["wizards:0:Name"]这样的写法,这是因为在Load文件时,存储的方式就是用:为分隔符,以作为嵌套对象的键值。

也可以用另一种方法来写,将配置信息绑定为对象。

先定义对象类型:


public class AppSettings
{
  public string Option1 { get; set; }
  public int Option2 { get; set; }
  public Subsection Subsection { get; set; }
  public IList<Wizards> Wizards { get; set; }
}

public class Subsection
{
  public string Suboption1 { get; set; }
}

public class Wizards
{
  public string Name { get; set; }
  public string Age { get; set; }
}

再绑定对象:


static void Main(string[] args)
{
  var builder = new ConfigurationBuilder()
    .SetBasePath(Directory.GetCurrentDirectory())
    .AddJsonFile("appsettings.json");

  Configuration = builder.Build();

  var appConfig = new AppSettings();
  Configuration.Bind(appConfig);

  Console.WriteLine($"option1 = {appConfig.Option1}");
  Console.WriteLine($"option2 = {appConfig.Option2}");
  Console.WriteLine(
    $"suboption1 = {appConfig.Subsection.Suboption1}");
  Console.WriteLine();

  Console.WriteLine("Wizards:");
  Console.Write($"{appConfig.Wizards[0].Name}, ");
  Console.WriteLine($"age {appConfig.Wizards[0].Age}");
  Console.Write($"{appConfig.Wizards[1].Name}, ");
  Console.WriteLine($"age {appConfig.Wizards[1].Age}");
  Console.WriteLine();

  Console.WriteLine("Press a key...");
  Console.ReadKey();
}