ASP.NET Core自定义配置源的案例分析
创始人
2024-11-27 12:25:33
0次

前言

正如大家所知,在 .NET Core 中配置文件改成了 appsettings.json,表面上和 .NET Framework 的 web.config 或 app.config 好像没有太大的区别,只是一种是 json ,一种是 xml,但其实 .NET Core 的配置体系是一种全新的设计,灵活且具扩展性。这里主要介绍一下在 .NET Core 的配置体系下如何扩展自定义配置源,配置源其实就是配置信息存放的载体,最常用的就是文件类型。

.NET Core 配置体系

在进行自定义配置源介绍前,我们需要先了解一下 .NET Core 中的配置体系。 .NET Core 的配置体系中主要包含 ConfigurationProvider、ConfigurationSource、ConfigurationBuilder、Configuration 几大核心对象。

ConfigurationProvider

实现 IConfigurationProvider 接口,配置源真正提供者,主要提供配置信息的加载与刷新。

ConfigurationSource

实现 IConfigurationSource 接口,提供对应的 ConfigurationProvider 具体实例。

ConfigurationBuilder

实现 IConfigurationBuilder 接口,负责将 ConfigurationSource 添加到配置源集合,再根据配置源集合构建出 ConfigurationRoot 对象,实现 IConfigurationRoot 接口。

Configuration

实现 IConfiguration 接口,Configuration 对象在逻辑上体现出树形化层次结构,配置信息均已键/值对的方式提供使用。

注 :*IConfigurationRoot 、IConfigurationSection 均继承于 IConfiguration,IConfigurationRoot 表示配置的根节点,IConfigurationSection 则表示配置的非根节点*

所以他们之间的关系就是 ConfigurationProvider 实现配置提供,然后通过 ConfigurationSource 构造配置源实例,接着通过 ConfigurationBuilder 将配置源实例 ConfigurationSource 添加到配置源集合中并构造出 ConfigurationRoot,最终以 Configuration 对象提供给程序使用。

ASP.NET Core自定义配置源的案例分析

默认情况下,Configuration 对象的 Providers 属性包含如下 Provider:

ASP.NET Core自定义配置源的案例分析

  1. ChainedConfigurationProvider:应用程序本身相关配置信息,如:applicationName、contentRoot;

  2. JsonConfigurationProvider:appsettings.json 和 appsettings.Development.json 中的配置信息;

  3. EnvironmentVariablesConfigurationProvider:环境变量的配置信息;

  4. 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>(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();
 });

测试效果
再次查看 Configuration 对象的 Providers 属性,发现已包含 CustomConfigurationProvider:

ASP.NET Core自定义配置源的案例分析

然后可通过 Configuration 对象获取对应 key 的内容:

[HttpGet]
public IEnumerable Get()
{
 return new string[] { _configuration["name"], _configuration["company"] };
}

ASP.NET Core自定义配置源的案例分析

相关内容

热门资讯

空调连续工作多久需要停机休息 空调连续工作的时间取决于多个因素,包括空调的型号、功率、使用环境和维护情况等。一般来说,空调可以连续...
空调哪个符号是除湿的 空调除湿功能通常用一个水滴形状的符号表示。不同品牌和型号的空调遥控器可能会有所差异,但一般来说,除湿...
格力空调多长时间加一次氟利昂 1、一般情况下,空调对氟利昂的使用量是非常小的,所以在空调使用了四年左右的时候再考虑加也没问题。2、...
空调用多长时间需要加氟一次 一般情况下是五年。当出现以下这几种情况时,空调才需要加氟。1、空调的室内机和室外机各有两个接口,当接...
格调生活·C标思享荟:卡萨帝在... 9月12日的郑州龙湖金融岛,夜风轻拂,灯光璀璨。“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑...
品牌价值破千亿、高端份额持续领... 9月12日,“C标时刻共传奇——卡萨帝思享荟暨20周年品牌盛典郑州站”在郑州龙湖金融岛举办。2026...
空调主板坏了修800还是换新的 空调主板坏了是修还是换新,需要考虑多个因素,以下是一些建议:1. 维修成本:如果维修费用较低,比如 ...
空调开多久需要休息多长时间 问题:空调开多久需要休息多长时间回答:1、在使用空调的过程中,一般空调开7~8个小时左右需要休息2~...
中央空调多长时间清洗一次 1、一般空调开机前清洗一次即可,空调开机中间时段再清洗一次,空调关机时清洗一次,这样比较合理。2、空...
中央空调氟利昂多久加一次 看空调制热和制冷程度,很多人的观点认为氟利昂必须一年放一次,其实这个观点是错误的,理解上面有点偏差,...