前言
在當今在網際網路微服務比較適用的情況下,docker 可以說一個利器。每次我們打包docker的時候都是適用docker 的配置檔案,那麼配置檔案裡面會設定環境變數,這個時候需要我們的應用能夠識別到這些環境變數並作出相應的選擇。
適用場景:
docker 執行環境
k8s 執行環境
因為他們都是隔離機制的,故而環境變數能夠發揮其非常好的作用。
正文
引入:microsoft.extensions.configuration.environmentVariables 這個包。
設定環境變數:
對應的lauchSettings.json 如下:
{
"profiles": {
"ConfigureDemo": {
"commandName": "Project",
"commandLineArgs": "-k1=value4",
"environmentVariables": {
"section1__key2": "value2",
"key1": "value1"
}
}
}
}
這個section1__key2,section1和key2 之間是兩個_,作為他們的分層符號。
程式碼:
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables();
var configurationRoot = builder.Build();
Console.WriteLine($"key1:{configurationRoot["key1"]}");
var section = configurationRoot.GetSection("section1");
Console.WriteLine($"key2:{section["key2"]}");
執行結果:
無限套娃模式也是適用的,前面原理已經講過了,這裡只演示程式碼。
{
"profiles": {
"ConfigureDemo": {
"commandName": "Project",
"commandLineArgs": "-k1=value4",
"environmentVariables": {
"section1__key2": "value2",
"key1": "value1",
"section2__section3__key3": "value3"
}
}
}
}
程式碼:
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables();
var configurationRoot = builder.Build();
Console.WriteLine($"key1:{configurationRoot["key1"]}");
var section = configurationRoot.GetSection("section1");
Console.WriteLine($"key2:{section["key2"]}");
var section2 = configurationRoot.GetSection("section2");
var section3 = section2.GetSection("section3");
Console.WriteLine($"key3:{section3["key3"]}");
除了上面的__可以作為section的分層符之外,:也是可以的。
下面演示字首過濾:
{
"profiles": {
"ConfigureDemo": {
"commandName": "Project",
"commandLineArgs": "-k1=value4",
"environmentVariables": {
"key1": "value1",
"k8s_key2": "value2"
}
}
}
}
程式碼:
IConfigurationBuilder builder = new ConfigurationBuilder();
builder.AddEnvironmentVariables("k8s_");
var configurationRoot = builder.Build();
Console.WriteLine($"key1:{configurationRoot["key1"]}");
Console.WriteLine($"key2:{configurationRoot["key2"]}");
結果:
就是說不是k8s_會被過濾掉。
結
下一節 配置系統之強型別配置。
以上只是個人整理,如有錯誤,望請指點,謝謝。