.NET Core开发之配置详解

2019-12-30 19:50:46王旭
  • 生成ConfigurationBuilder对象
  • 添加ConfigurationSource对象

    创建Configuration对象

    查看创建Configuration对象的代码,会发现内部利用的其实是ConfigurationSource中创建的ConfigurationProvider对象。

    
    public IConfigurationRoot Build()
    {
      var providers = new List<IConfigurationProvider>();
      foreach (var source in Sources)
      {
        var provider = source.Build(this);
        providers.Add(provider);
      }
      return new ConfigurationRoot(providers);
    }

    再看IConfiguratonSource接口,也只有一个Build方法。

    
    public interface IConfigurationSource
    {
      IConfigurationProvider Build(IConfigurationBuilder builder);
    }

    最终创建的Configuration对象,即ConfigurationRoot中包含了所有的ConfigurationProvider,说明配置信息都由这些ConfigurationProvider所提供。

    跟踪至ConfigurationRoot类型的构造方法,果然在其生成对象时,对所有ConfigurationProvider进行了加载操作。

    
    public ConfigurationRoot(IList<IConfigurationProvider> providers)
    {
      ...
    
      _providers = providers;
      foreach (var p in providers)
      {
        p.Load();
        ChangeToken.OnChange(() => p.GetReloadToken(), () => RaiseChanged());
      }
    }

    比如JsonConfigurationProvider中:

    
    public override void Load(Stream stream)
    {
      try
      {
        Data = JsonConfigurationFileParser.Parse(stream);
      }
      ...
    }

    通过JSON解析器,将JSON文件的配置信息读取至ConfigurationProvider的Data属性中。这个属性即是用于保存所有配置信息。

    
     /// <summary>
     /// The configuration key value pairs for this provider.
     /// </summary>
     protected IDictionary<string, string> Data { get; set; }