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

 更新时间:2021年9月22日 10:00  点击:1469

前言

正如大家所知,在 .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 可供参考。

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

[!--infotagslink--]

相关文章

  • .NET Core下使用Kafka的方法步骤

    这篇文章主要介绍了.NET Core下使用Kafka的方法步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • C#创建自定义控件及添加自定义属性和事件使用实例详解

    这篇文章主要给大家介绍了关于C#创建自定义控件及添加自定义属性和事件使用的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧...2020-06-25
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • Vue 组件复用多次自定义参数操作

    这篇文章主要介绍了Vue 组件复用多次自定义参数操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-07-27
  • android自定义动态设置Button样式【很常用】

    为了增强android应用的用户体验,我们可以在一些Button按钮上自定义动态的设置一些样式,比如交互时改变字体、颜色、背景图等。 今天来看一个通过重写Button来动态实...2016-09-20
  • Android自定义WebView网络视频播放控件例子

    下面我们来看一篇关于Android自定义WebView网络视频播放控件开发例子,这个文章写得非常的不错下面给各位共享一下吧。 因为业务需要,以下代码均以Youtube网站在线视...2016-10-02
  • 详解.NET Core 3.0 里新的JSON API

    这篇文章主要介绍了详解.NET Core 3.0 里新的JSON API,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 自定义jquery模态窗口插件无法在顶层窗口显示问题

    自定义一个jquery模态窗口插件,将它集成到现有平台框架中时,它只能在mainFrame窗口中显示,无法在顶层窗口显示. 解决这个问题的办法: 通过以下代码就可能实现在顶层窗口弹窗 复制代码 代码如下: $(window.top.documen...2014-05-31
  • 自定义feignClient的常见坑及解决

    这篇文章主要介绍了自定义feignClient的常见坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-20
  • pytorch 自定义卷积核进行卷积操作方式

    今天小编就为大家分享一篇pytorch 自定义卷积核进行卷积操作方式,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-05-06
  • ASP.NET Core根据环境变量支持多个 appsettings.json配置文件

    这篇文章主要介绍了ASP.NET Core根据环境变量支持多个 appsettings.json配置文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2021-09-22
  • 记一次EFCore类型转换错误及解决方案

    这篇文章主要介绍了记一次EFCore类型转换错误及解决方案,帮助大家更好的理解和学习使用asp.net core,感兴趣的朋友可以了解下...2021-09-22
  • PHP YII框架开发小技巧之模型(models)中rules自定义验证规则

    YII的models中的rules部分是一些表单的验证规则,对于表单验证十分有用,在相应的视图(views)里面添加了表单,在表单被提交之前程序都会自动先来这里面的规则里验证,只有通过对其有效的限制规则后才能被提交,可以很有效地保证...2015-11-24
  • jquery自定义插件开发之window的实现过程

    这篇文章主要介绍了jquery自定义插件开发之window的实现过程的相关资料,需要的朋友可以参考下...2016-05-09
  • C#自定义事件监听实现方法

    这篇文章主要介绍了C#自定义事件监听实现方法,涉及C#事件监听的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
  • 详解ASP.NET Core 中基于工厂的中间件激活的实现方法

    这篇文章主要介绍了ASP.NET Core 中基于工厂的中间件激活的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-09-22
  • Underscore源码分析

    Underscore 是一个 JavaScript 工具库,它提供了一整套函数式编程的实用功能,但是没有扩展任何 JavaScript 内置对象。这篇文章主要介绍了underscore源码分析相关知识,感兴趣的朋友一起学习吧...2016-01-02
  • 详解.NET Core 使用HttpClient SSL请求出错的解决办法

    这篇文章主要介绍了.NET Core 使用HttpClient SSL请求出错的解决办法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2021-09-22
  • 使用BindingResult 自定义错误信息

    这篇文章主要介绍了使用BindingResult 自定义错误信息,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-10-23
  • 在Vue中获取自定义属性方法:data-id的实例

    这篇文章主要介绍了在Vue中获取自定义属性方法:data-id的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2020-09-09