Поделиться через


Привязка конфигурации к словарю расширяет значения

При привязке конфигурации с помощью Dictionary<TKey,TValue> объекта, в котором значение является мутируемым типом коллекции, привязка к одному ключу несколько раз расширяет коллекцию значений вместо замены всей коллекции новым значением.

Представленная версия

.NET 7

Предыдущее поведение

Рассмотрим следующий код, который привязывает конфигурацию с одним ключом с именем Key к словарю несколько раз.

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 при каждой привязке было перезаписано. Код создал следующие выходные данные:

Initially: InitialValue
Bind: NewValue
Bind again: NewValue

Новое поведение

Начиная с .NET 7 значение словаря расширяется каждый раз при привязке одного и того же ключа, добавляя новое значение, а также сохраняя все существующие значения в массиве. Тот же код из раздела "Предыдущее поведение " создает следующие выходные данные:

Initially: InitialValue
Bind: InitialValue, NewValue
Bind again: InitialValue, NewValue, NewValue

Тип разрушающего изменения

Это изменение поведения.

Причина изменения

Это изменение улучшает поведение привязки, не переопределяя ранее добавленные значения в массивах значений словаря.

Если новое поведение не является удовлетворительным, вы можете вручную управлять значениями внутри массива после привязки.

Затронутые API