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

好久以前,在玩Docker的時候順便扒了扒,最近,終於下定決心花了些時間整理併成文,但願可以給你們一些幫助。docker

目錄  

  • .NET Core中的配置數據庫

  • ASP.NET Core中的配置json

  • 扒一扒環境變量提供程序app

  • 爲何是「__」?ide

  • 「__」如何變成了「:」?學習

  • 數據庫鏈接字符串的配置的特殊規則ui

  • 最後spa

 

前言

.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

 只是結合代碼,可以更易於咱們理解以及使用。

相關文章
相關標籤/搜索