ASP.NET Core如何自定义配置源示例详解

2019-11-19 18:38:57于海丽

    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: