Configuration 在ASP.NET Core开发过程中起着很重要的作用,这篇博客主要是理解configuration的来源,以及各种不同类型的configuration source是如何被加载进程序的。

Configuration 的数据源

.NET Core 应用程序的数据源可以有以下几项:

  • 设置文件,例如appsettings.json
  • 环境变量
  • Azure 密钥保管库
  • Azure 应用程序配置
  • 命令行参数
  • 自定义提供程序,已安装或已创建
  • 目录文件
  • 内存中的 .NET 对象

Configuration 如何被加载

我们发现数据源类型可以千差万别,那cnfiguration 是如何把它们都load进来的呢?

根据上一篇的博客[https://www.cnblogs.com/peppa-nan/p/14953807.html]。

我们知道在CreateDefaultBuilder 的时候,主机会加载进一些环境变量,命令行参数,settings.json 等,这些其实是通过各种不同类型的 Configuration Provider去实现的。

常见的配置提供程序有如下几类:

提供者 提供配置从
Azure Key Vault 配置提供程序 Azure 密钥保管库
Azure 应用程序配置提供程序 Azure 应用程序配置
命令行配置提供程序 命令行参数
自定义配置提供程序 自定义源
环境变量配置提供程序 环境变量
文件配置提供程序 INI、JSON 和 XML 文件
每个文件的密钥配置提供程序 目录文件
内存配置提供程序 内存中的集合
用户机密 用户配置文件目录中的文件

配置源按其配置提供程序的指定顺序读取。在代码中对配置提供程序进行排序,以适应应用程序所需的底层配置源的优先级。

意思是: 我们其实是通过指定configuration provider 的顺序,来决定了各项配置源的优先级别。

默认顺序是:

配置提供程序的典型序列是:

  1. appsettings.json
  2. 应用程序设置Environmentjson
  3. 用户机密
  4. 使用环境变量配置提供程序环境变量
  5. 使用命令行配置提供程序命令行参数。

示例: INI提供程序和JsonFile 提供程序。 以下代码 清除所有配置提供程序并添加几个配置提供程序

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
config.Sources.Clear(); // 清除已加载的配置程序 var env = hostingContext.HostingEnvironment;
          
          /// 提供 ini file 配置提供程序

config.AddIniFile("MyIniConfig.ini", optional: true, reloadOnChange: true)
.AddIniFile($"MyIniConfig.{env.EnvironmentName}.ini",
optional: true, reloadOnChange: true); config.AddEnvironmentVariables(); if (args != null)
{
config.AddCommandLine(args);
}
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

Configuration Provider 源码解析

在调用 AddJsonFile 时,后续通过一系列的重载,其实会call: 代码链接:

https://github.com/dotnet/runtime/blob/99f7bae2a236b1bc5f3a6c35fd29df49f13bd539/src/libraries/Microsoft.Extensions.Configuration.Json/src/JsonConfigurationExtensions.cs#L65

        public static IConfigurationBuilder AddJsonFile(this IConfigurationBuilder builder, IFileProvider provider, string path, bool optional, bool reloadOnChange)
{
if (builder == null)
{
throw new ArgumentNullException(nameof(builder));
}
if (string.IsNullOrEmpty(path))
{
throw new ArgumentException(SR.Error_InvalidFilePath, nameof(path));
} return builder.AddJsonFile(s =>
{
s.FileProvider = provider; //JsonConfigurationProvider.cs
s.Path = path;
s.Optional = optional;
s.ReloadOnChange = reloadOnChange;
s.ResolveFileProvider();
});
}

Configuration 自定义实现

我们可以看一个流行的轻量级 配置中心, AgileConfig,这里不重点去讨论整个AgileConfig的实现,只是去关注如何把获取到的 配置加载进configuration 供程序使用;

本质上是继承了 ConfigurationProvider并重写了里面的方法:

public class AgileConfigProvider : ConfigurationProvider
{
private ConfigClient Client { get; } public AgileConfigProvider(IConfigClient client)
{
Client = client as ConfigClient;
Client.ConfigChanged += (arg) =>
{
this.OnReload();
};
} /// <summary>
/// load方法调用ConfigClient的Connect方法,Connect方法会在连接成功后拉取所有的配置。
/// </summary>
public override void Load()
{
Client.ConnectAsync().GetAwaiter().GetResult() ;
Data = Client.Data;
} }

里面的 ConfigClient 负责维护和server 的websocket 连接,获取server 推送的消息,并且进行心跳检测等等;

ConfigClient的源代码地址在: 【传送门】https://github.com/kklldog/AgileConfig_Client/blob/master/AgileConfig.Client/ConfigClient.cs

和Configuration 的关系不是很大,这里不再展开说;

-------------------------------------------------------------------

会持续整理发布关于后端和NET Core, .NET 的相关学习和认知,欢迎大家一起讨论学习。

ASP.Net Core Configuration 理解与源码分析的更多相关文章

  1. 各类最新Asp .Net Core 项目和示例源码

    1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...

  2. .net core 轻量级容器 ServiceProvider 源码分析

    首先看 ServiceCollection 的定义 //定义 public class ServiceCollection : IServiceCollection { private readonl ...

  3. ASP.NET CORE 启动过程及源码解读

    在这个特殊的春节,大家想必都在家出不了们,远看已经到了回城里上班的日子,但是因为一只蝙蝠的原因导致我们无法回到工作岗位,大家可能有的在家远程办公,有些在家躺着看书,有的是在家打游戏:在这个特殊无聊的日 ...

  4. asp.net MVC 模拟实现与源码分析

    前言 本文流程#1: 从一个空项目->模拟实现一个从/Home/Test形式的URL敲入->后台逻辑处理->传入后台model参数->调用razor引擎->前台展示 涉及 ...

  5. 【MyBatis源码分析】Configuration加载(下篇)

    元素设置 继续MyBatis的Configuration加载源码分析: private void parseConfiguration(XNode root) { try { Properties s ...

  6. Vue3中的响应式对象Reactive源码分析

    Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...

  7. [asp.net core 源码分析] 01 - Session

    1.Session文档介绍 毋庸置疑学习.Net core最好的方法之一就是学习微软.Net core的官方文档:https://docs.microsoft.com/zh-cn/aspnet/cor ...

  8. 一个由正则表达式引发的血案 vs2017使用rdlc实现批量打印 vs2017使用rdlc [asp.net core 源码分析] 01 - Session SignalR sql for xml path用法 MemCahe C# 操作Excel图形——绘制、读取、隐藏、删除图形 IOC,DIP,DI,IoC容器

    1. 血案由来 近期我在为Lazada卖家中心做一个自助注册的项目,其中的shop name校验规则较为复杂,要求:1. 英文字母大小写2. 数字3. 越南文4. 一些特殊字符,如“&”,“- ...

  9. ASP.NET Core[源码分析篇] - WebHost

    _configureServicesDelegates的承接 在[ASP.NET Core[源码分析篇] - Startup]这篇文章中,我们得知了目前为止(UseStartup),所有的动作都是在_ ...

随机推荐

  1. FastDFS依赖无法导入

    FastDFS依赖无法导入 fastdfs-client-java 导入爆红 <!-- FastDFS--> <dependency> <groupId>org.c ...

  2. Docker------阿里云部署私有镜像仓库

    Docker------阿里云部署私有镜像仓库   前言 公共镜像仓库 官方:https://hub.docker.com/ 基于各个软件开发或者软件提供方开发的 非官方:其它组织或公司开发的镜像,供 ...

  3. 串口配合DMA接收不定长数据(空闲中断+DMA接收)-(转载)

    1.空闲中断和别的接收完成(一个字节)中断,发送完成(发送寄存器控)中断的一样是串口中断: 2.空闲中断是接收到一个数据以后,接收停顿超过一字节时间  认为桢收完,总线空闲中断是在检测到在接收数据后, ...

  4. 一个开源的MY BLOG

    my blog My Blog是由Docker+SpringBoot+Mybatis+thymeleaf等技术实现的Java博客系统,本来是一个docker和springboot的实战练习项目,目前已 ...

  5. 10.7 netstat:查看网络状态

    netstat命令 用于显示本机网络的连接状态.运行端口和路由表等信息. netstat命令的参数选项及说明 -r 显示路由表信息,该功能类似于前面学过的route 和ip route-g 显示多播功 ...

  6. IDEA 配置 Tomcat(详细)(Day_12)

    如果这世界上真有奇迹,那只是努力的另一个名字.生命中最难的阶段,不是没有人懂你,而是你不懂你自己. 运行环境 AND 版本 JDK8 + IntelliJ IDEA 2018.3  +   Tomca ...

  7. 【数据结构与算法】多种语言(VB、C、C#、JavaScript)系列数据结构算法经典案例教程合集目录

    目录 1. 专栏简介 2. 专栏地址 3. 专栏目录 1. 专栏简介 2. 专栏地址 「 刘一哥与GIS的故事 」之<数据结构与算法> 3. 专栏目录 [经典回放]多种语言系列数据结构算法 ...

  8. 小程序中在设置了textarea后三个祖级内事件失效

    在一次写小程序项目中收货地址中的详细地址时,我用的是文本域,下边的三个bindtap事件却不能使用了:下图: 报错信息如下图: 通过一番查找以及尝试之后,我发现是因为textarea标签的问题,但是依 ...

  9. es 查询更新操作

    # es 查询更新操作# _*_ coding: utf-8 _*_ import time import datetime import pymysql from elasticsearch imp ...

  10. Docker学习(14) Docker容器的数据管理

    Docker容器的数据管理 Docker容器的数据卷 重要: Docker的数据卷容器 Docker数据卷的备份和还原