ConfigurationBinder lève une exception pour une valeur incompatible
Auparavant, BinderOptions.ErrorOnUnknownConfiguration était utilisé uniquement pour lever une exception si une valeur existait dans la configuration, mais pas dans le modèle lié. À présent, si cette propriété est définie sur true
, une exception est également levée si la valeur de la configuration ne peut pas être convertie en type de valeur dans le modèle.
Version introduite
.NET 8 Preview 1
Comportement précédent
Auparavant, le code suivant avalait silencieusement les exceptions pour les champs qui contenaient des énumérations non valides :
public enum TestSettingsEnum
{
Option1,
Option2,
}
public class MyModelContainingArray
{
public TestSettingsEnum[] Enums { get; set; }
}
public void SilentlySwallowsInvalidItems()
{
var dictionary = new Dictionary<string, string>
{
["Section:Enums:0"] = "Option1",
["Section:Enums:1"] = "Option3", // invalid - ignored
["Section:Enums:2"] = "Option4", // invalid - ignored
["Section:Enums:3"] = "Option2",
};
var configurationBuilder = new ConfigurationBuilder();
configurationBuilder.AddInMemoryCollection(dictionary);
var config = configurationBuilder.Build();
var configSection = config.GetSection("Section");
var model = configSection.Get<MyModelContainingArray>(o => o.ErrorOnUnknownConfiguration = true);
// Only Option1 and Option2 are in the bound collection at this point.
}
Nouveau comportement
À compter de .NET 8, si une valeur de configuration ne peut pas être convertie en type de la valeur dans le modèle, une InvalidOperationException est levée.
Type de changement cassant
Ce changement est un changement de comportement.
Raison du changement
Le comportement précédent était déroutant pour certains développeurs. Ils définissaient BinderOptions.ErrorOnUnknownConfiguration sur true
et s’attendaient à ce qu’une exception soit levée si un problème était rencontré lorsque la configuration était liée.
Action recommandée
Si votre application a des valeurs de configuration qui ne peuvent pas être converties en propriétés dans le modèle lié, modifiez ou supprimez les valeurs.
Ou bien, définissez BinderOptions.ErrorOnUnknownConfiguration sur false
.
API affectées
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get(IConfiguration, Type, Action<BinderOptions>)