zoukankan      html  css  js  c++  java
  • 扒一扒.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

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

  • 相关阅读:
    好题记录
    「同余数论」学习笔记
    「网络流」学习笔记
    物理知识相关内容总结
    「多项式」学习笔记
    「数论函数」学习笔记
    「点分治」学习笔记
    「线性基」学习笔记
    「后缀自动机」学习笔记
    「后缀数组」学习笔记
  • 原文地址:https://www.cnblogs.com/codelove/p/10668722.html
Copyright © 2011-2022 走看看