以前,只有当配置中存在某个值而被绑定的模型中不存在该值时,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.ErrorOnUnknownConfiguration 设置为 true
,并预期在已绑定配置的情况下遇到任何问题时,引发一个异常。
建议的操作
如果应用具有无法转换为绑定模型中的属性的配置值,请更改或删除这些值。
或者,将 BinderOptions.ErrorOnUnknownConfiguration 设置为 false
。
受影响的 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>)