-
ChainedConfigurationProvider:应用程序本身相关配置信息,如:applicationName、contentRoot;
JsonConfigurationProvider:appsettings.json 和 appsettings.Development.json 中的配置信息;
EnvironmentVariablesConfigurationProvider:环境变量的配置信息;
CommandLineConfigurationProvider:命令行输入的配置信息;
这些类型的 Provider 在 .NET Core Web 项目中默认会自动加载,不需要手动配置,当然预置的 Provider 并不止这几种。
自定义配置源
前面提到 .NET Core 的配置体系是具有扩展性的,所以我们可以实现自定义的配置源,比如基于配置中心(如:etcd、apollo、consul 等)的实现,下面将模拟从配置中心获取,先了解整体实现方式,后面也会介绍我们在实际项目中基于 etcd 的实现方案。
创建 ConfigurationProvider
自定义 Provider 需要继承 ConfigurationProvider,然后重写 Load 方法,设置 Data 属性。
public class CustomConfigurationProvider : ConfigurationProvider
{
public override void Load()
{
// 模拟从远程配置中心获取配置信息
using var httpClient = new HttpClient
{
BaseAddress = new Uri("http://localhost:5000")
};
var response = httpClient.GetStringAsync("/api/configs")
.ConfigureAwait(false)
.GetAwaiter()
.GetResult();
if (!string.IsNullOrEmpty(response))
{
Data = JsonConvert.DeserializeObject<Dictionary<string, string>>(response);
}
}
}
http://localhost:5000/api/configs 接口返回的 json 字符串,如下:
{"name":"beck","company":"mingdao"}
创建 ConfigurationSource
实现 IConfigurationSource 接口,在 Build 方法中返回 CustomConfigurationProvider 实例。
public class CustomConfigurationSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new CustomConfigurationProvider();
}
}
加入 ConfigurationBuilder 配置源列表
添加 IConfigurationBuilder 扩展方法 AddCustom,将 CustomConfigurationSource 加入配置源集合中。
public static class CustomConfigurationExtensions
{
public static IConfigurationBuilder AddCustom(this IConfigurationBuilder builder)
{
return builder.Add(new CustomConfigurationSource());
}
}
启动入口添加 AddCustom
在 Program.cs 中的 ConfigureAppConfiguration 引用自定义配置源:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureAppConfiguration((context, configBuiler) =>
{
configBuiler.AddCustom();
});
webBuilder.UseStartup<Startup>();
});
测试效果
再次查看 Configuration 对象的 Providers 属性,发现已包含 CustomConfigurationProvider:








