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
- 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>)