扒一扒.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的配置非常靈活和強大,想了解更多,大家可以直接通過官網學習:
只是結合程式碼,能夠更易於我們理解以及使用。