Configuración de enlace al diccionario amplía los valores

Cuando se enlaza una configuración mediante un objeto Dictionary<TKey,TValue> en el que el valor es un tipo de colección mutable, el enlace a la misma clave más de una vez amplía la colección de valores en lugar de reemplazar toda la colección por el nuevo valor.

Versión introducida

.NET 7

Comportamiento anterior

Tenga en cuenta el código siguiente que enlaza una configuración que tiene una sola clave denominada Key a un diccionario varias veces.

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"])}");

Anteriormente a .NET 7, el valor de Key se sobrescribía en cada enlace. El código ha generado la siguiente salida:

Initially: InitialValue
Bind: NewValue
Bind again: NewValue

Comportamiento nuevo

A partir de .NET 7, el valor del diccionario se extiende cada vez que se enlaza la misma clave, agregando el nuevo valor, pero manteniendo también los valores existentes en la matriz. El mismo código de la sección Comportamiento anterior produce el siguiente resultado:

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

Tipo de cambio importante

Este es un cambio de comportamiento.

Motivo del cambio

Este cambio mejora el comportamiento de enlace al no invalidar los valores agregados previamente en matrices de valores de diccionario.

Si el nuevo comportamiento no es satisfactorio, puede manipular manualmente los valores dentro de la matriz después del enlace.

API afectadas