Поделиться через


ConfigurationBinder вызывает несовпадение значения

Ранее использовался исключительно для создания исключения, если значение существовало в конфигурации, BinderOptions.ErrorOnUnknownConfiguration но не в модели, к которой привязано. Теперь, если для этого свойства задано trueзначение, исключение также возникает, если значение в конфигурации не может быть преобразовано в тип значения в модели.

Представленные версии

.NET 8( предварительная версия 1)

Прежнее поведение

Ранее следующий код автоматически проглотил исключения для полей, содержащих недопустимые перечисления:

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

Новое поведение

Начиная с .NET 8, если значение конфигурации не может быть преобразовано в тип значения в модели, InvalidOperationException создается исключение.

Тип критического изменения

Это изменение поведения.

Причина изменения

Предыдущее поведение было запутано для некоторых разработчиков. Они устанавливают BinderOptions.ErrorOnUnknownConfigurationtrue и ожидают, что исключение будет возникать, если возникла какая-либо проблема при привязке конфигурации.

Если в приложении есть значения конфигурации, которые не могут быть преобразованы в свойства в связанной модели, измените или удалите значения.

Кроме того, задайте для falseнего значение BinderOptions.ErrorOnUnknownConfiguration .

Затронутые API