連鎖構成における空の文字列は、それ以前のプロバイダーの設定を上書きします

.NET 11 以降では、AddConfigurationを使用して追加された構成では、空の文字列が値が存在するものとして扱われます。 したがって、空の文字列は、それらの以前の値を有効なままにしておくのではなく、外側の構成で以前に登録されたプロバイダーからの値をオーバーライドします。

この変更により、.NET 10 で 構成でNull値が保持されるによって確立された、空の構成値と null構成値との区別が引き続き維持されます。 チェーン構成による null の処理は変更されていません。

導入されたバージョン

.NET 11 RC 1

以前の動作

ChainedConfigurationProvider.TryGet は空の文字列を「見つからない」と報告しました。 その結果、チェーン構成の空の値は、先行するプロバイダーによって提供された値をオーバーライドしませんでした。

using System;
using System.Collections.Generic;
using Microsoft.Extensions.Configuration;

IConfiguration inner = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        ["Endpoint"] = "",
    })
    .Build();

IConfiguration configuration = new ConfigurationBuilder()
    .AddInMemoryCollection(new Dictionary<string, string?>
    {
        ["Endpoint"] = "https://example.com",
    })
    .AddConfiguration(inner)
    .Build();

Console.WriteLine($"Endpoint: '{configuration["Endpoint"]}'");

.NET 11 より前の出力は次のとおりです。

Endpoint: 'https://example.com'

以前の値が存在しない場合は、キーを読み取ると null が返され、チェーンされた空の文字列が唯一の値であるセクションは存在しないと見なされました。

新しい動作

.NET 11 以降では、ChainedConfigurationProvider.TryGet は空の文字列を検出済みとして報告します。 前の例では、 inner の空の値が前の値をオーバーライドし、出力は次のようになります。

Endpoint: ''

値が空の文字列であるセクションが存在すると見なされるようになりました。 また、バインディングでも、以前のプロバイダーの値ではなく空の値が監視されます。 たとえば、以前の数値に対して空の文字列を整数プロパティにバインドすると、InvalidOperationException がスローされます。これは、直接追加されたプロバイダーによって指定された空の値が与えられた場合と一貫しています。

ラップされたIConfiguration内のnull値は、IConfigurationインデクサーが値がnullであるキーと存在しないキーを区別できないため、引き続き存在しないものとして扱われます。

破壊的変更の種類

この変更は 動作の変更です。

変更理由

空の文字列は有効な構成値です。 これを欠落として扱うと、チェーン構成が直接追加された構成プロバイダーと矛盾し、アプリケーションが空の文字列で設定をオーバーライドすることで、意図的に設定をクリアまたは無効にすることができなくなります。 新しい動作では、構成プロバイダーによる空の値と存在しない値の区別が維持されます。 詳細については、 dotnet/runtime#131480 を参照してください。

空の文字列が以前の値をオーバーライドすることを意図している場合は、アクションは必要ありません。

アプリがチェーン構成内の空の文字列に依存して以前のプロバイダーの値が優先されるようにしている場合は、チェーンされた構成からそのキーを削除するか、未設定または null として表します。 また、文字列以外の型に連結された値をバインドするアプリケーションでは、空の値がターゲット型に対して有効でない場合は、バインド前に空の値を検証または正規化する必要があります。 以前の動作を復元するための互換性スイッチはありません。

影響を受ける API