环境变量前缀

分层数据使用 : 作为级别分隔符来表示。 但对于环境变量,: 字符规范化为 __,因为后者在所有平台上都受支持。 此更改会影响规范化和非规范化前缀与键的比对方式。 具体而言,现在可以通过指定包含 :__ 作为分隔符的前缀来添加环境变量。 这两种语法都将匹配任何具有匹配前缀后跟 :__ 的环境变量。 以前理论上与筛选器不匹配的某些环境变量现在可能与筛选器匹配。

引入的版本

.NET 7 预览版 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

另请参阅