Partilhar via


ConfigurationBinder lança para valor incompatível

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

Versão introduzida

.NET 8 Visualização 1

Comportamento anterior

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

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 para o tipo do valor no modelo, um InvalidOperationException será lançado.

Tipo de mudança de rutura

Esta mudança é uma mudança comportamental.

Razão para a alteração

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

Se o seu aplicativo tiver valores de configuração que não podem ser convertidos para as propriedades no modelo acoplado, altere ou remova os valores.

Como alternativa, defina BinderOptions.ErrorOnUnknownConfiguration como false.

APIs afetadas