专栏首页雪雁的专栏扒一扒.NET Core的环境配置提供程序

扒一扒.NET Core的环境配置提供程序

前言

很久之前,在玩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 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: 值:MySql.Data.MySqlClient

SQLAZURECONNSTR_<KEY>

ConnectionStrings:<KEY>

键:ConnectionStrings:<KEY>_ProviderName: 值:System.Data.SqlClient

SQLCONNSTR_<KEY>

ConnectionStrings:<KEY>

键:ConnectionStrings:<KEY>_ProviderName: 值:System.Data.SqlClient

如果说了这么多你还不太明白,简单的来讲,对于常用的数据库连接字符串,.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

只是结合代码,能够更易于我们理解以及使用。

本文分享自微信公众号 - magiccodes(xl----0),作者:magiccodes

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-04-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 一张图来看看.NETCore和前后端技术的演进之路

    2019年3月10日,在长沙.NET 技术社区组织的技术沙龙《.NET Core和前后端分离那些事儿》上,我们曾经试图通过一系列抽丝剥茧的过程来引导大家在这条基...

    心莱科技雪雁
  • 《.NET Core 和前后端那些事儿》技术交流活动纪实

    2019年3月10日,下午,在位于沁园春御院的长沙市互联网活动基地,在长沙市.NET技术社区的组织下,长沙市.NET技术圈第一次纯粹的技术沙龙在这里召开。这次活...

    心莱科技雪雁
  • 使用Kubeadm创建k8s集群之部署规划(三十一)

    上一篇我们讲述了使用Kubectl管理k8s集群,那么接下来,我们将使用kubeadm来启动k8s集群。

    心莱科技雪雁
  • 扒一扒.NET Core的环境配置提供程序

    很久之前,在玩Docker的时候顺便扒了扒,最近,终于下定决心花了些时间整理并成文,希望能够给大家一些帮助。

    雪雁-心莱科技
  • Excel数据分析案例:用Excel训练支持向量机(SVM)

    这里使用的数据集Kaggle上名为“ Titanic:来自灾难的机器学习”的机器学习竞赛。它指的是1912年泰坦尼克号号沉没。在这场悲剧中,2,224名乘客中有...

    沉默的白面书生
  • .NET Core多平台开发体验[2]: Mac OS X

    除了微软自家的Windows平台, .NET Core针对Mac OS以及各种Linux(RHEL、Ubuntu、Debian、Fedora、CentOS和SU...

    蒋金楠
  • 机器学习三人行(系列四)----手写数字识别实战(附代码)

    今天我们根据mnist手写数字的数据集来对0-9共10个数字进行分类,旨在通过这个分类项目的学习,一起学习分类的相关知识和技巧。 由于篇幅有限,代码未全部贴出,...

    智能算法
  • 机器学习三人行-手写数字识别实战

    前面三个系列我们分别从机器学习入门,洞悉数据,已经数据预处理,回归建模等方面进行了系统的学习。 今天我们根据mnist手写数字的数据集来对0-9共10个数字进行...

    企鹅号小编
  • 推荐一个免费的生成词云(word cloud)的在线工具

    “词云”这个概念由美国西北大学新闻学副教授、新媒体专业主任里奇·戈登(Rich Gordon)提出。

    Jerry Wang
  • [译]Unity 实用技巧

    TextArea 特性可以让我们更加方便的在 Inspector 中编辑字符串文本.

    用户2615200

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动