好久以前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,但愿可以给你们一些帮助。docker
.NET Core中的配置数据库
ASP.NET Core中的配置json
扒一扒环境变量提供程序app
为何是“__”?ide
“__”如何变成了“:”?学习
数据库链接字符串的配置的特殊规则ui
最后spa
· 命令行参数命令行
· 目录文件(.json、xml、ini)调试
· 环境变量
· 内存中的对象
· Azure Key Vault
本篇咱们侧重于扒一扒.NET Core的环境配置程序,了解其执行机制和特殊规则以及原理。由于经过环境变量来配置在不少场景都很是有用,尤为是在Docker环境之中。具体使用你们能够看看下面给出的截图和配置示例。
在.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中,包“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 stringNormalizeKey(string key) { return key.Replace("__",ConfigurationPath.KeyDelimiter); }
在上图咱们看到了一些特殊的判断,也就是扒出了数据库链接字符串的几个特殊名称前缀,这是怎么回事呢?这里咱们补充说明一下:
针对链接字符串,.NET Core提供了一些特殊的处理规则。主要支持如下数据库:
链接字符串前缀 |
提供程序 |
CUSTOMCONNSTR_ |
自定义提供程序 |
MYSQLCONNSTR_ |
MySQL |
SQLAZURECONNSTR_ |
Azure SQL 数据库 |
SQLCONNSTR_ |
SQL Server |
当发现有以上前缀的环境变量时,会进行一些特殊处理:根据前缀在ConnectionStrings节添加对应的键值对,而且添加数据库提供程序的配置,以下所示:
环境变量键 |
转换的配置键 |
提供程序配置条目 |
CUSTOMCONNSTR_<KEY> |
ConnectionStrings:<KEY> |
配置条目未建立。 |
MYSQLCONNSTR_<KEY> |
ConnectionStrings:<KEY> |
键: ConnectionStrings:<KEY>_ProviderName: |
SQLAZURECONNSTR_<KEY> |
ConnectionStrings:<KEY> |
键: ConnectionStrings:<KEY>_ProviderName: |
SQLCONNSTR_<KEY> |
ConnectionStrings:<KEY> |
键: ConnectionStrings:<KEY>_ProviderName: |
若是说了这么多你还不太明白,简单的来说,对于经常使用的数据库链接字符串,.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的配置很是灵活和强大,想了解更多,你们能够直接经过官网学习:
只是结合代码,可以更易于咱们理解以及使用。