Compartilhar via


ConfigurationBinder é gerado para um valor incompatível

Anteriormente, BinderOptions.ErrorOnUnknownConfiguration era usado apenas para gerar uma exceção se houvesse um valor na configuração, mas não no modelo ao qual ele estava associado. Agora, se essa propriedade estiver definida como true, uma exceção também será gerada se o valor na configuração não puder ser convertido no tipo de valor no modelo.

Versão introduzida

.NET 8 versão prévia 1

Comportamento anterior

Anteriormente, o código a seguir engolia silenciosamente as exceções para os campos que continham enumerações inválidas:

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.
}

Novo comportamento

A partir do .NET 8, se um valor de configuração não puder ser convertido no tipo do valor no modelo, um InvalidOperationException será gerado.

Tipo de mudança disruptiva

Esta é uma alteração comportamental.

Motivo da alteração

O comportamento anterior era confuso para alguns desenvolvedores. Eles definiram BinderOptions.ErrorOnUnknownConfiguration para true e esperavam que uma exceção fosse lançada se algum problema fosse encontrado quando a configuração fosse vinculada.

Se o aplicativo tiver valores de configuração que não podem ser convertidos nas propriedades no modelo associado, altere ou remova os valores.

Como alternativa, defina BinderOptions.ErrorOnUnknownConfiguration como false.

APIs afetadas