針對不符的值擲回 ConfigurationBinder
先前,只有當一個值存在於組態中,但不在繫結的模型中時,則才會使用 BinderOptions.ErrorOnUnknownConfiguration 來引發例外狀況。 現在,如果此屬性設定為 true
,當組態中的值無法轉換成模型中的值類型時,也會擲回例外狀況。
導入的版本
.NET 8 Preview 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>)