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

前言

正如大家所知,在 .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 对象提供给程序使用。

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

  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:

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

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

总结

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

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

(0)

相关推荐

  • .Net Core自定义配置源从配置中心读取配置的方法

    前言 配置,几乎所有的应用程序都离不开它..Net Framework时代我们使用App.config.Web.config,到了.Net Core的时代我们使用appsettings.json,这些我们再熟悉不过了.然而到了容器化.微服务的时代,这些本地文件配置有的时候就不太合适了.当你把本地部署的服务搬到docker上后,你会发现要修改一个配置文件变的非常麻烦.你不得不通过宿主机进入容器内部来修改文件,也许容器内还不带vi等编辑工具,你连看都不能看,改都不能.更别说当你启动多个容器实例来做分

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

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

  • ASP.NET Core实现自定义WebApi模型验证详解

    Framework时代 在Framework时代,我们一般进行参数验证的时候,以下代码是非常常见的 [HttpPost] public async Task<JsonResult> SaveNewCustomerAsnyc(AddCustomerInput input) { if (!ModelState.IsValid) { return Json(Result.FromCode(ResultCode.InvalidParams)); } ..... } 或者高级一点是实现IActionFi

  • ASP.NET Core WebSocket集群实现思路详解

    目录 前言 实现 nginx配置 一对一发送 群组发送 发送所有人 整合到一起 一对一处理 群组处理 全员消息处理 示例源码 总结 前言 提到WebSocket相信大家都听说过,它的初衷是为了解决客户端浏览器与服务端进行双向通信,是在单个TCP连接上进行全双工通讯的协议.在没有WebSocket之前只能通过浏览器到服务端的请求应答模式比如轮询,来实现服务端的变更响应到客户端,现在服务端也可以主动发送数据到客户端浏览器.WebSocket协议和Http协议平行,都属于TCP/IP四层模型中的第四层

  • ASP.NET Core中Cookie验证身份用法详解

    目录 添加配置 ASP.NETCore1.x ASP.NETCore2.x 创建身份认证Cookie ASP.NETCore1.x ASP.NETCore2.x Signingout(登出) ASP.NETCore1.x ASP.NETCore2.x 服务端变化反馈 ASP.NETCore1.x ASP.NETCore2.x Cookie设置选项 ASP.NETCore1.x ASP.NETCore2.x 持久Cookie ASP.NETCore1.x ASP.NETCore2.x 绝对到期时间

  • springboot项目配置swagger2示例详解

    swagger简介 Swagger是一款RESTful接口的文档在线自动生成.功能测试功能框架.一个规范和完整的框架,用于生成.描述.调用和可视化RESTful风格的Web服务,加上swagger-ui,可以有很好的呈现. 当我们在后台的接口修改了后,swagger可以实现自动的更新,而不需要人为的维护这个接口进行测试. 一.swagger2中常用的注解作用 注解 作用 @Api 修饰整个类,描述Controller的作用 ,表示标识这个类是swagger的资源 @ApiOperation 描述

  • VSCode各语言运行环境配置方法示例详解

    系统环境变量的配置 如:将F:\mingw64\bin添加到系统环境变量Path中 VSCode软件语言json配置C语言 创建个.vscode文件夹,文件夹内创建以下两个文件 launch.json 文件配置 { "version": "0.2.0", "configurations": [ { "name": "(gdb) Launch", "type": "cppdbg&

  • uniapp自定义相机实现示例详解

    目录 自定义相机 起因 利用livePusher实现 使用 效果图 拓展 实现多种自定义相机 水印相机 身份证相机 人像相机 自定义相机 起因 由于最近用uniapp调用原生相机容易出现闪退问题,找了很多教程又是压缩图片又是优化代码,我表示并没有太大作用!! 于是开启了我的解决之路 利用livePusher实现 实现自定义相机 拓展性挺强的,可以实现自定义水印.身份证拍摄.人像拍摄等 这里我简单实现一个相机功能主要用于解决闪退 Tip:这里需要创建nvue文件哦~ 创建camera.nvue <

  • ASP.NET Core使用HostingStartup增强启动操作方法详解

    概念 在ASP.NET Core中我们可以使用一种机制来增强启动时的操作,它就是HostingStartup.如何叫"增强"操作,相信了解过AOP概念的同学应该都非常的熟悉.我们常说AOP使用了关注点分离的方式,增强了对现有逻辑的操作.而我们今天要说的HostingStartup就是为了"增强"启动操作,这种"增强"的操作甚至可以对现有的程序可以做到无改动的操作.例如,外部程序集可通过HostingStartup实现为应用提供配置服务.注册服务或

  • ASP.NET Core利用Jaeger实现分布式追踪详解

    前言 最近我们公司的部分.NET Core的项目接入了Jaeger,也算是稍微完善了一下.NET团队的技术栈. 至于为什么选择Jaeger而不是Skywalking,这个问题我只能回答,大佬们说了算. 前段时间也在CSharpCorner写过一篇类似的介绍 Exploring Distributed Tracing Using ASP.NET Core And Jaeger. 下面回到正题,我们先看一下Jaeger的简介 Jaeger的简单介绍 Jaeger是Uber开源的一个分布式追踪的工具,

  • ASP.NET Core MVC压缩样式、脚本详解

    前言 在.NET Core之前对于压缩样式文件和脚本我们可能需要借助第三方工具来进行压缩,但在ASP.NET MVC Core中则无需借助第三方工具来完成,本节我们来看看ASP.NET Core MVC为我们提供了哪些方便. 自动压缩样式和脚本 当我们在测试环境中肯定不需要压缩脚本的,如果一旦压缩脚本的话,若在控制台出现错误不利于我们调试,但是在生产环境中我们通过压缩脚本或者样式一来可以减少传输流量,二来可以加速页面加载时间,换句话说,此时我们需要测试环境和生产环境对应的原生版本和压缩版本,那么

随机推荐