環境變數前置詞

階層式資料的表示會使用 : 作為層級分隔符號。 對於環境變數,則會將 : 字元正規化成所有平台都支援的 __。 此變更會影響正規化/非正規化前置詞和索引鍵的比較方式。 具體而言,您現在可以藉由指定包含 :__ 作為分隔符號的前置詞來新增環境變數。 兩種語法都會尋找相符前置詞後接有 :__ 的環境變數。 先前在實際操作上,有一些環境變數篩選不到,現在都沒問題了。

導入的版本

.NET 7 Preview 4

先前的行為

下列程式碼先前會列印 False

using Microsoft.Extensions.Configuration;

const string myValue = "value1";
Environment.SetEnvironmentVariable("MY_PREFIX__ConfigKey", myValue);

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "MY_PREFIX__")
    .Build();

var loadedValue = config.GetValue<string?>("ConfigKey", null);

Console.WriteLine(String.Equals(myValue, loadedValue));
// False

為能將 MY_PREFIX__ConfigKey 環境變數新增至組態,您必須使用 : 分隔符號來新增環境變數,而不是 __

using Microsoft.Extensions.Configuration;

const string myValue = "value1";
Environment.SetEnvironmentVariable("MY_PREFIX__ConfigKey", myValue);

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "MY_PREFIX:")
    .Build();

var loadedValue = config.GetValue<string?>("ConfigKey", null);

Console.WriteLine(String.Equals(myValue, loadedValue));
// True

新的行為

自 .NET 7 起,下列程式碼會列印 True

using Microsoft.Extensions.Configuration;

const string myValue = "value1";
Environment.SetEnvironmentVariable("MY_PREFIX__ConfigKey", myValue);

IConfiguration config = new ConfigurationBuilder()
    .AddEnvironmentVariables(prefix: "MY_PREFIX__")
    .Build();

var loadedValue = config.GetValue<string?>("ConfigKey", null);

Console.WriteLine(String.Equals(myValue, loadedValue));
// True

中斷性變更的類型

這項變更會影響二進位相容性

變更原因

此變更的目的在修正 .NET 6 中,正規化環境變數前置詞篩選時非預期行為變更。 新行為和 .NET 5 的行為一樣。

因為此變更在變更先前的錯誤行為,所以大多數開發人員都不受影響。 若使用的前置詞包含了 __,與包含 __的環境變數不相符,請考慮變更這些變數的前置詞,但此情況不太可能出現。

受影響的 API

另請參閱