次の方法で共有


構成をディクショナリにバインドすると値が拡張される

値が変更可能なコレクション型である 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