.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
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Get<T>(IConfiguration, Action<BinderOptions>)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object)
- Microsoft.Extensions.Configuration.ConfigurationBinder.Bind(IConfiguration, Object, Action<BinderOptions>)
.NET