ConfigurationBinder가 잘못된 배열 요소를 자동으로 건너뜁니다.

.NET 8부터, ConfigurationBinder 값이 대상 형식으로 변환될 수 없는 배열 및 목록 요소를 알리지 않고 자동으로 건너뜁니다. 이전에는 실패한 요소가 자리 표시자로 유지되었고 null 결과 컬렉션은 구성 원본의 요소 수와 동일한 길이를 유지했습니다.

도입된 버전

.NET 8

이전 동작

이전에는 배열 또는 목록 속성을 통해 Get<T>(IConfiguration) 바인딩하거나 Bind(IConfiguration, Object)요소의 값을 대상 형식으로 변환할 수 없는 경우 해당 요소가 결과에서 자리 표시자로 null 유지되었습니다. 컬렉션 길이가 구성의 요소 수와 일치했습니다.

// Configuration source, for example, appsettings.json:
// "Items": [
//   { "Name": "A", "Interval": 10 },
//   { "Name": "B", "Interval": "a" }   <-- invalid int
// ]

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 6/7 result:
// settings.Length == 2
// settings[0] = { Name = "A", Interval = 10 }
// settings[1] = null   (conversion failed, placeholder preserved)

새 동작

.NET 8부터 형식 변환에 실패한 요소는 조용히 건너뜁니다. 결과 컬렉션은 성공적으로 바인딩된 요소만 포함하며 구성 원본의 항목 수보다 길이가 짧습니다.

var settings = configuration.GetSection("Items").Get<MyItem[]>();

// .NET 8+ result:
// settings.Length == 1
// settings[0] = { Name = "A", Interval = 10 }

파괴적 변경 유형

이 변경은 동작 변경입니다.

변경 이유

내부 구현 ConfigurationBinder 은 .NET 8에서 리팩터링되었습니다. 이제 바인더는 최종 배열을 완성하기 전에, 대상 배열 및 바인딩 요소를 미리 할당하는 대신 성공적으로 바인딩된 요소만 임시 목록으로 수집합니다 (변환 실패에 null가 남음).

이전 동작은 int[]와 같은 값 형식에도 문제가 있었습니다. 잘못된 구성 값의 경우 바인더는 0과 구별되지 않는 0으로 저장됩니다. 새 동작은 이러한 모호성을 방지합니다.

  • 개발 중에 요소를 자동으로 삭제하지 않고 잘못된 구성 값을 즉시 표시하도록 설정합니다ErrorOnUnknownConfiguration.

    var settings = configuration.GetSection("Items").Get<MyItem[]>(options =>
        options.ErrorOnUnknownConfiguration = true);
    

    .NET 8부터 이 옵션은 값을 대상 형식으로 변환할 수 없을 때 ConfigurationBinder에서 InvalidOperationException을 throw하도록 합니다. 자세한 내용은 일치하지 않는 값에 대한 ConfigurationBinder throw를 참조하세요.

  • 잘못된 구성 값을 수정합니다. 구성 원본의 모든 값이 바인딩된 모델의 예상 형식과 일치하는지 확인합니다.

  • 코드가 구성 원본과 일치하는 요소 수에 따라 달라지는 경우 바인딩 후 컬렉션 길이의 유효성을 검사합니다.

  • 변환할 수 없는 값을 정상적으로 처리하고 모든 배열 항목을 유지해야 하는 경우 수동 구문 분석과 함께 문자열 속성을 사용합니다.

영향을 받는 API