ASP.Net Core Configuration 理解与源码分析
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 的顺序,来决定了各项配置源的优先级别。
默认顺序是:
配置提供程序的典型序列是:
- appsettings.json
- 应用程序设置。
Environment. json - 用户机密
- 使用环境变量配置提供程序的环境变量。
- 使用命令行配置提供程序的命令行参数。
示例: 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 理解与源码分析的更多相关文章
- 各类最新Asp .Net Core 项目和示例源码
1.网站地址:http://www.freeboygirl.com2.网站Asp .Net Core 资料http://www.freeboygirl.com/blog/tag/asp%20net%2 ...
- .net core 轻量级容器 ServiceProvider 源码分析
首先看 ServiceCollection 的定义 //定义 public class ServiceCollection : IServiceCollection { private readonl ...
- ASP.NET CORE 启动过程及源码解读
在这个特殊的春节,大家想必都在家出不了们,远看已经到了回城里上班的日子,但是因为一只蝙蝠的原因导致我们无法回到工作岗位,大家可能有的在家远程办公,有些在家躺着看书,有的是在家打游戏:在这个特殊无聊的日 ...
- asp.net MVC 模拟实现与源码分析
前言 本文流程#1: 从一个空项目->模拟实现一个从/Home/Test形式的URL敲入->后台逻辑处理->传入后台model参数->调用razor引擎->前台展示 涉及 ...
- 【MyBatis源码分析】Configuration加载(下篇)
元素设置 继续MyBatis的Configuration加载源码分析: private void parseConfiguration(XNode root) { try { Properties s ...
- Vue3中的响应式对象Reactive源码分析
Vue3中的响应式对象Reactive源码分析 ReactiveEffect.js 中的 trackEffects函数 及 ReactiveEffect类 在Ref随笔中已经介绍,在本文中不做赘述 本 ...
- [asp.net core 源码分析] 01 - Session
1.Session文档介绍 毋庸置疑学习.Net core最好的方法之一就是学习微软.Net core的官方文档:https://docs.microsoft.com/zh-cn/aspnet/cor ...
- 一个由正则表达式引发的血案 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. 一些特殊字符,如“&”,“- ...
- ASP.NET Core[源码分析篇] - WebHost
_configureServicesDelegates的承接 在[ASP.NET Core[源码分析篇] - Startup]这篇文章中,我们得知了目前为止(UseStartup),所有的动作都是在_ ...
随机推荐
- java的"\\s+"什么意思?
例如:String[] tt=addr.split("\\s+");\\s ==\s 表示转义字符 ,\s表示匹配任意空格(包括空格,制表符,换页符)\\s+中的'+'表示多次匹配
- 15.Git
1.Git介绍 1.1版本控制(理解) 无论是代码编写,还是文档编写,我们都会遇到对文档内容反复修改的情况 1.2开发中存在的问题(理解) 程序员小明负责的模块就要完成了,就在即将提交发布之前的一瞬间 ...
- ruby基础(一)
Ruby基础 1.对象.变量和常量 1.1 对象 在Ruby中表示数据的最基本单位是对象,任何数据都是对象,使用类来表示对象的种类. 一个某个类的对象称作对象的实例. 对象 类 eg 数值 Numer ...
- [Qt] 事件机制(二)
在samp4_1中加一个小功能,点击右上角关闭按钮时,弹出"确认是否关闭"的消息框.如果点"yes"则关闭,如果点"No"则不关闭 在wid ...
- Vim安装记录
Vim安装记录 参考链接 安装命令 1. 安装依赖库 2. 下载最新vim源码 3. 删除旧版vim 4. 配置configure.编译.安装 5. 设置vim为默认编辑器 6. 必要的配置 Vim安 ...
- Linux useradd 命令介绍
Linux useradd 命令介绍 作者: Alan Formy-duval 译者: LCTT Brooke Lau | 2020-01-06 22:58 使用 useradd 命令来添加用户(并且 ...
- 007.kubernets的headless service配置和ingress的简单配置
前面配置了servcie的nodepoint和clusterIP附在均衡 一 headless service配置 1.1 默认下的DNS配置 [root@docker-server1 deploym ...
- FD_SET -(转自 kakaxia6337的专栏)
FD_ZERO,FD_ISSET这些都是套节字结合操作宏 看看MSDN上的select函数, 这是在select io 模型中的核心,用来管理套节字IO的,避免出现无辜锁定. int se ...
- ace-editor
1. ace-editor编辑器只读状态:editor.setReadOnly(true); // false to make it editable 2. ace-editor设置程序语言模式:e ...
- maven工具使用json-lib时,JSONArray.fromObject()不能执行的解决方案
前端代码我就不展示了 ,下面说明下我遇到问题的情况,如果不想看可以直接划到黄色字体部分直接找解决方法哦~~(相关jar包我会放在云中,想要的自己下载哦,链接在视频最下面!!) 我的pom文件,如下,导 ...