很久之前, 在玩 Docker 的时候顺便扒了扒, 最近, 终于下定决心花了些时间整理并成文, 希望能够给大家一些帮助.
目录
.NET Core 中的配置
ASP.NET Core 中的配置
扒一扒环境变量提供程序
为什么是 "__"?
"__" 如何变成了 ":"?
数据库连接字符串的配置的特殊规则
最后
前言
.NET Core 的配置提高程序非常强大和灵活, 支持从各种配置源读取键值对:
. 命令行参数
. 目录文件 (.JSON,xml,INI)
. 环境变量
. 内存中的对象
. Azure Key Vault
本篇我们侧重于扒一扒. NET Core 的环境配置程序, 了解其执行机制和特殊规则以及原理. 因为通过环境变量来配置在很多场景都非常有用, 尤其是在 Docker 环境之中. 具体使用大家可以看看下面给出的截图和配置示例.
.NET Core 中的配置
在. NET Core 中, 我们通常这么玩:
1. 添加依赖:
- <PackageReferenceInclude="Microsoft.Extensions.Configuration" Version="2.2.0"
- />
- <PackageReferenceInclude="Microsoft.Extensions.Configuration.CommandLine"
- Version="2.2.0" />
- <PackageReferenceInclude="Microsoft.Extensions.Configuration.EnvironmentVariables"
- Version="2.2.0" />
2. 添加配置代码
- privatestaticvoid Main(string[] args)
- {
- var config = newConfigurationBuilder()
- // 支持命令行参数
- .AddCommandLine(args)
- // 支持环境变量
- .AddEnvironmentVariables()
- .Build();
- }
ASP.NET Core 中的配置
因为在 ASP.NET Core 中, 包 "Microsoft.AspNetCore.App" 已经包含了对 "Microsoft.Extensions.Configuration" 等包的依赖, 因此在 ASP.NET Core 的应用程序中, 通常我们会用以下代码来启用配置提供程序:
有时候我们也会使用下面代码来自定义配置:
对于第一种写法, 我们可以通过查看源码了解其具体机制:
扒一扒环境变量提供程序
接下来我们重点扒一扒环境变量提供程序, 环境变量提供程序在容器这块应用极广, 也极为方便, 比如设置日志的输出级别:
docker run --nameaspnetcore_sample --rm -it -p 8000:80 -e 'Logging__LogLevel__Default=Debug' microsoft/dotnet-samples:aspnetapp
docker run --nameaspnetcore_sample1 --rm -it -p 8000:80 microsoft/dotnet-samples:aspnetapp
通过上面的对比, 我们可以第一个命令通过设置了环境变量 "Logging__LogLevel__Default=Debug" 输出了调试日志. 而且从上面代码来看, 环境变量的配置会覆盖文件配置:
那么 "Logging__LogLevel__Default" 对应什么样的文件配置呢? 如下所示:
- {
- "Logging": {
- "LogLevel": {
- "Default": "Warning"
- }
- },
- "AllowedHosts": "*"
- }
如上所示, 这个配置我们在 appsettings.JSON 中能够找到. 不过很奇怪的是, 为什么通过环境变量配置会变成 "Logging__LogLevel__Default" 呢 (注意中间是两个下划线)?
为什么是 "__"?
我们继续来扒一扒. 继续看源码:
首先我们查看 AddEnvironmentVariables 的代码:
顺藤摸瓜找到了 EnvironmentVariablesConfigurationSource:
最终扒开了 EnvironmentVariablesConfigurationProvider 的代码, 找到了关键:
我们来挨个解析下重点.
"__" 如何变成了 ":"?
这个 "__" 在我们使用的时候, 怎么变成 ":" 的呢? 比如我们使用的时候都是这么玩的:
appConfiguration["RedisCache:ConnectionString"]
关键代码如下所示:
- private static string NormalizeKey(string key)
- {
- return key.Replace("__",ConfigurationPath.KeyDelimiter);
- }
数据库连接字符串的配置的特殊规则
在上图我们看到了一些特殊的判断, 也就是扒出了数据库连接字符串的几个特殊名称前缀, 这是怎么回事呢? 这里我们补充说明一下:
针对连接字符串,.NET Core 提供了一些特殊的处理规则. 主要支持以下数据库:
当发现有以上前缀的环境变量时, 会进行一些特殊处理: 根据前缀在 ConnectionStrings 节添加对应的键值对, 并且添加数据库提供程序的配置, 如下所示:
如果说了这么多你还不太明白, 简单的来讲, 对于常用的数据库连接字符串,.NET 环境变量提供程序提供了内置的简写进行配置, 比如在 Docker 参数中我们可以这么配置:
-e 'SQLCONNSTR_Default=Server= 192.168.1.11;Database=test; User ID=dev;Password=dev;'
如上所示, 其中 Default 对应配置文件的示例如下图所示:
这样说是否明白了呢? 如上所示, 主要支持 MySQL,Azure SQL 数据库和 SQL Server.
最后
我们再来看看环境变量最终是如何变成配置路径, 如以下代码:
至此, 整个环境变量提供程序均已扒完, 这次就说到这里.
.NET Core 的配置非常灵活和强大, 想了解更多, 大家可以直接通过官网学习:
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-2.2#environment-variables-configuration-provider
只是结合代码, 能够更易于我们理解以及使用.
来源: http://www.jianshu.com/p/287282bbdb29