Udostępnij przez


Prefiksy zmiennych środowiskowych

Dane hierarchiczne są reprezentowane przy użyciu : jako ogranicznika poziomu. Jednak w przypadku zmiennych środowiskowych znak : jest znormalizowany do __, ponieważ ten ostatni jest obsługiwany na wszystkich platformach. Ta zmiana wpływa na sposób porównywania znormalizowanych i nie znormalizowanych prefiksów i kluczy. W szczególności można teraz dodać zmienne środowiskowe, określając prefiks zawierający : lub __ jako ogranicznik. Składnia będzie zgodna z dowolnymi zmiennymi środowiskowymi z odpowiednim prefiksem, po którym następuje : lub __. Niektóre zmienne środowiskowe, które teoretycznie nie pasują do filtru wcześniej, mogą teraz być zgodne z filtrem.

Wersja wprowadzona

.NET 7 (wersja zapoznawcza 4)

Poprzednie zachowanie

Wcześniej został wydrukowany Falsenastępujący kod:

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

Aby zmienna MY_PREFIX__ConfigKey środowiskowa była dodawana do konfiguracji, trzeba było dodać zmienne środowiskowe przy użyciu ogranicznika : zamiast __:

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

Nowe zachowanie

Począwszy od platformy .NET 7, następujący kod wyświetla 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

Typ zmiany przełamującej

Ta zmiana może mieć wpływ na zgodność binarną.

Przyczyna zmiany

Ta zmiana została wprowadzona w celu naprawienia niezamierzonej zmiany zachowania w celu normalizacji filtrów prefiksów zmiennych środowiskowych na platformie .NET 6. Nowe zachowanie jest zgodne z zachowaniem platformy .NET 5.

Większość programistów nie zostanie dotknięta tą zmianą, ponieważ poprawia ona wcześniej błędne działanie. W mało prawdopodobnym przypadku, że polegałeś na tym, że prefiks zawierający __ nie pasuje do zmiennej środowiskowej zawierającej __, rozważ zmianę prefiksów tych zmiennych.

Interfejsy API, których dotyczy problem

Zobacz także