構成バインダーによって空のキーがディクショナリに追加される
以前のバージョンでは、構成がディクショナリ型にバインドされていた場合、構成に対応する値がないキーはスキップされ、ディクショナリに追加されませんでした。 この動作が変更され、このようなキーがスキップされなくなり、既定値で自動的に作成されるようになりました。 この変更により、構成に一覧表示されたすべてのキーが、確実にディクショナリ内に存在するようになります。
導入されたバージョン
.NET 8 Preview 5
以前の動作
以前は、構成内の空のキーは、ディクショナリ型にバインドする際にスキップされていました。 次の構成文字列とバインディング コードについて考えてみましょう。
var json = @"{
""Queues"": {
""q1"": {
""V"": 1
},
""q2"": {
""V"": 2
},
""q3"": {
}
}
}";
public class Q
{
public Dictionary<string, QueueValue> Queues { get; set; } = new();
}
public class QueueValue
{
public int V { get; set; }
}
var configuration = new ConfigurationBuilder()
.AddJsonStream(StringToStream(json))
.Build();
Q options = new Q();
configuration.Bind(options);
foreach (var kvp in options.Queues)
{
Console.WriteLine($"{kvp.Key}: {kvp.Value.V}");
}
以前は、次の出力が表示されていました (キー q3
が存在しないことに注目してください)。
q1: 1
q2: 2
新しい動作
.NET 8 以降では、空の構成キーは、構成のバインド中に既定値でディクショナリに追加されます。
「以前の動作」セクションのコードで考えると、次のテキストが出力され、q3
が既定値でディクショナリに追加されたことが示されています。
q1: 1
q2: 2
q3: 0
破壊的変更の種類
この変更は、動作変更です。
変更理由
ユーザーからの要求に基づくこの変更により、構成に一覧表示されたすべてのキーが、確実にディクショナリ内に存在するようになります。 すべてのキーが存在することで、プロセスが合理化され、キーがないことによる潜在的な問題を回避できます。
推奨アクション
値が空の状態で新しく作成されるディクショナリ エントリの存在に対応できるように、アプリケーション ロジックを確認して調整します。 この新しい動作が望ましくない場合は、値が空のエントリを構成から削除します。 これらのエントリを削除すると、値が空のディクショナリ エントリはバインド プロセス中に追加されません。
影響を受ける API
.NET