値の不一致に対して 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.ErrorOnUnknownConfigurationtrue に設定し、構成がバインドされたときに "何らかの" 問題が発生した場合に、例外がスローされると想定していました。

バインドされたモデルのプロパティに変換できない構成値がアプリにある場合は、その値を変更または削除します。

または、BinderOptions.ErrorOnUnknownConfigurationfalse に設定します。

影響を受ける API