다음을 통해 공유


구성에서 Null 값이 유지됨

.NET 구성 바인더는 구성 공급자를 통해 구성 값을 검색하고 이러한 값을 개체 속성에 바인딩하려고 시도합니다. 이전에는 구성 값이 null이면 바인더에서 값이 전혀 없는 것처럼 처리하여 바인딩을 건너뛰었다. 즉, 값과 누락된 값을 null 구분하지 않았습니다. 이 동작으로 인해 구성에서 명시적으로 정의된 null 값이 존중되고 적절하게 바인딩될 것으로 예상한 사용자에게 상당한 혼란이 발생했습니다.

또한 JSON 구성 공급자는 이전에 구성의 null 값을 빈 문자열로 변환했습니다. 이렇게 하면 이러한 값에 바인딩된 속성이 예상된 null이 아닌 빈 문자열을 받게 되면서 혼동이 더욱 커졌습니다.

이 변경은 두 문제를 모두 해결합니다. 이제 JSON 구성 공급자는 값을 변경하지 않고 올바르게 보고 null 하고 바인더는 값을 유효한 입력으로 처리 null 하여 다른 값처럼 바인딩합니다.

또한 이 업데이트에는 배열 내의 바인딩 null 값을 지원하는 향상된 기능이 포함되어 있으며 빈 배열의 바인딩을 사용할 수 있습니다.

도입된 버전

.NET 10

이전 동작

이전에는 구성 값이 있을 null때 바인더가 값이 전혀 없는 것처럼 처리하여 바인딩을 건너뛰었다. 시스템은 null 값과 누락된 값을 구분하지 않았습니다.

또한 JSON 구성 공급자는 구성의 null 값을 빈 문자열로 변환했습니다. 이로 인해 이러한 값에 바인딩된 속성이 예상 null된 문자열이 아닌 빈 문자열을 받습니다.

다음 구성 파일 appsettings.json 내용을 고려합니다.

{
    "NullConfiguration": {
        "StringProperty": null,
        "IntProperty": null,
        "Array1": [null, null],
        "Array2": []
    }
}

해당 바인딩 코드는 다음과 같습니다.

public class NullConfiguration
{
    public NullConfiguration()
    {
        // Initialize with non-default value to
        // ensure binding overrides these values.
        StringProperty = "Initial Value";
        IntProperty = 123;
    }
    public string? StringProperty { get; set; }
    public int? IntProperty { get; set; }
    public string[]? Array1 { get; set; }
    public string[]? Array2 { get; set; }
}

var configuration = new ConfigurationBuilder()
                    .AddJsonFile("appsettings.json")
                    .Build().GetSection("NullConfiguration");

// Now bind the configuration.
NullConfiguration? result = configuration.Get<NullConfiguration>();

Console.WriteLine($"StringProperty: '{result!.StringProperty}', intProperty: {(result!.IntProperty.HasValue ? result!.IntProperty : "null")}");
Console.WriteLine($"Array1: {(result!.Array1 is null ?
    "null" : string.Join(", ", result!.Array1.Select(a => $"'{(a is null ? "null" : a)}'")))}");
Console.WriteLine($"Array2: {(result!.Array2 is null ?
    "null" : string.Join(", ", result!.Array2.Select(a => $"'{(a is null ? "null" : a)}'")))}");

출력:

StringProperty: '', intProperty: 123
Array1: '', ''
Array2: null

출력에 대한 설명:

  • StringProperty null: JSON 공급자가 JSON의 값을 빈 문자열("")로 변환하여 초기 값을 덮어씁니다.
  • IntProperty: 제공자가 null을 빈 문자열로 변환했기 때문에, 이것이 int?로 구문 분석될 수 없어 원래 값이 유지되고 변경되지 않았습니다(123).
  • Array1: 각 null 배열 요소가 빈 문자열로 처리되었으므로 두 개의 빈 문자열이 포함된 배열에 바인딩됩니다.
  • Array2: 바인더에서 JSON의 빈 배열 null 이 무시된 이후 남아 [] 있습니다.

새 동작

.NET 10 null 부터 값은 배열 요소를 포함하여 해당 속성에 올바르게 바인딩됩니다. 빈 배열도 올바르게 인식되고 무시되지 않고 빈 배열로 바인딩됩니다.

동일한 코드 샘플을 실행하면 JSON 구성 공급자를 사용하여 다음 결과가 생성됩니다.

StringProperty: 'null', intProperty: null
Array1: 'null', 'null'
Array2:

파괴적 변경 유형

이는 동작 변경.

변경 이유

이전 동작은 혼란스럽고 자주 사용자 불만으로 이어졌습니다. 이 문제를 해결하면 구성 바인딩 프로세스가 더욱 직관적이고 일관되어 혼동을 줄이고 사용자 기대에 맞게 동작을 조정합니다.

이전 동작을 선호하는 경우 그에 따라 구성을 조정할 수 있습니다.

  • JSON 구성 공급자를 사용하는 경우 값을 빈 문자열(null)로 바꿔 "" 원래 동작을 복원합니다. 여기서 빈 문자열은 대신 null바인딩됩니다.
  • null 값을 지원하는 다른 공급자의 경우, 누락된 값은 무시되고 기존 속성 값은 변경되지 않은 상태로 유지되도록 이전 동작을 재현하려면 구성에서 null 항목을 제거하십시오.

영향을 받는 API