値が変更可能なコレクション型である Dictionary<TKey,TValue> オブジェクトを使用して構成をバインドする場合、同じキーに複数回バインドすると、コレクション全体を新しい値に置き換えるのではなく、値コレクションが拡張されるようになりました。
導入されたバージョン
.NET 7
以前の動作
Keyという名前の 1 つのキーを持つ構成をディクショナリに複数回バインドする次のコードについて考えてみましょう。
using Microsoft.Extensions.Configuration;
IConfiguration config = new ConfigurationBuilder()
.AddInMemoryCollection()
.Build();
config["Key:0"] = "NewValue";
var dict = new Dictionary<string, string[]>() { { "Key", new[] { "InitialValue" } } };
Console.WriteLine($"Initially: {String.Join(", ", dict["Key"])}");
config.Bind(dict);
Console.WriteLine($"Bind: {String.Join(", ", dict["Key"])}");
config.Bind(dict);
Console.WriteLine($"Bind again: {String.Join(", ", dict["Key"])}");
.NET 7 より前では、 Key の値はバインドごとに 1 つ上書きされていました。 このコードでは、次の出力が生成されました。
Initially: InitialValue
Bind: NewValue
Bind again: NewValue
新しい動作
.NET 7 以降では、同じキーがバインドされるたびにディクショナリ値が拡張され、新しい値が追加されますが、配列内の既存の値も保持されます。 前の動作セクションと同じコードで、次の出力が生成されます。
Initially: InitialValue
Bind: InitialValue, NewValue
Bind again: InitialValue, NewValue, NewValue
破壊的変更の種類
この変更は 動作の変更です。
変更の理由
この変更により、ディクショナリ値配列で以前に追加された値をオーバーライドしないことで、バインディング動作が向上します。
推奨されるアクション
新しい動作が十分でない場合は、バインド後に配列内の値を手動で操作できます。
影響を受ける API
GitHub で Microsoft と共同作業する
このコンテンツのソースは GitHub にあります。そこで、issue や pull request を作成および確認することもできます。 詳細については、共同作成者ガイドを参照してください。
.NET