欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-10 09:03:32
前言 正如大家所知,在 .net core 中配置文件改成了 appsettings.json,表面上和 .net framework 的 web.config 或 app.conf...

前言

正如大家所知,在 .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<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:

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

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

[httpget]
public ienumerable<string> get()
{
 return new string[] { _configuration["name"], _configuration["company"] };
}

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

总结

以上完成了一个简单的自定义配置源,实际情况会比这复杂些。如果关注过 jsonconfigurationprovider 的配置加载参数,有一个 reloadonchange 参数用来设置当配置文件有变化时是否重新加载,如果 reloadonchange 设置为 true,当配置文件变化时不需要重启服务就可以生效,很多时候我们是需要 provider 具有这个功能的,在接下来介绍的 etcdconfigurationprovider 中会实现,实现源码 已在 github 可供参考。

好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对的支持。