好久以前,在玩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的配置很是靈活和強大,想了解更多,你們能夠直接經過官網學習:
只是結合代碼,可以更易於咱們理解以及使用。