Partager via


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.

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