.NET 11 RC 1부터 비동기 유효성 검사기만 사용하는 옵션 유형에 대한 동기 액세스가 빠르게 실패합니다. 비동기 유효성 검사 없이 옵션 인스턴스를 반환하는 대신, 동기 생성 경로에서는 OptionsValidationException 예외를 발생시킵니다.
도입된 버전
.NET 11 RC 1
이전 동작
이전에는 .NET 11 Preview 6 및 Preview 7에서는 IAsyncValidateOptions<TOptions>가 IValidateOptions<TOptions>와는 독립적이었습니다. 비동기 유효성 검사기는 비동기 시작 유효성 검사 경로를 통해서만 실행되었습니다.
IOptions<TOptions>.Value, CurrentValue, Get, IOptionsSnapshot<TOptions>.Value, Get 또는 Create와 같은 동기식 생성 경로를 통해 비동기 유효성 검사가 적용되는 옵션 형식에 액세스하면 비동기 유효성 검사기가 실행되지 않았습니다. 동기 경로는 유효성이 검사되지 않은 옵션 인스턴스를 반환했습니다.
ValidateAsync을 직접 구현한 형식은 IAsyncValidateOptions<TOptions>만 구현하면 되었습니다.
새 동작
.NET 11 RC 1부터는 IAsyncValidateOptions<TOptions>는 IValidateOptions<TOptions>에서 파생되며, 인터페이스는 더 이상 반공변이 아닙니다. 비동기 유효성 검사기는 동기 유효성 검사기와 동일한 유효성 검사기 컬렉션에 참여합니다.
동기 생성 경로를 통해 비동기 유효성 검사기만 있는 옵션 형식에 액세스하면 상속된 Validate 메서드는 실패한 ValidateOptionsResult메서드를 반환합니다.
Create그러면 OptionsValidationException을(를) 발생시킵니다. 예외 메시지는 옵션에 동기적으로 액세스하기 전에 호출 ValidateOnStart 하고 시작을 완료하도록 지시합니다.
직접 구현 IAsyncValidateOptions<TOptions> 하는 사용자 지정 형식도 이제 상속된 Validate 메서드를 구현해야 합니다.
파괴적 변경 유형
이 변경은 동작 변경 이며 원본 호환성에 영향을 줄 수 있습니다. 미리 보기 이진 파일이 다시 컴파일 없이 직접 구현되는 IAsyncValidateOptions<TOptions> 좁은 시나리오에서는 변경 내용이 이진 호환성에도 영향을 줄 수 있습니다.
변경 이유
비동기 옵션 유효성 검사는 .NET 11 Preview 6에서 시작 전용 유효성 검사 경로로 도입되었습니다. 시작 후 유효성 검사에 대한 이후 디자인 작업에서는 정확성 차이가 드러냅니다. 옵션에는 동기 생성 및 액세스 경로도 있습니다. 비동기 인터페이스만 구현한 유효성 검사기는 이러한 동기 경로를 통해 실행할 수 없으므로 비동기 유효성 검사를 실행하기 전에 잘못된 옵션을 반환하고 캐시할 수 있습니다.
API가 안정적인 릴리스에 도달하기 전에 그 격차를 해소하기 위해, 이제 IAsyncValidateOptions<TOptions>는 IValidateOptions<TOptions>에서 파생됩니다. 통합 계약은 하나의 유효성 검사기 컬렉션을 유지하고, 등록 순서를 유지하며, 실행 가능한 예외로 지원되지 않는 동기 액세스가 실패하게 합니다. 자세한 내용은 dotnet/runtime#131197 및 승인된 API 제안을 참조하세요.
권장 작업
비동기 유효성 검사기만 사용하는 옵션의 경우 옵션에 동기적으로 액세스하기 전에 호스트 시작을 호출 ValidateOnStart 하고 완료합니다.
services.AddOptions<MyOptions>()
.Configure(o => o.Value = 42)
.ValidateAsync(o => Task.FromResult(o.Value > 0), "Value must be positive.")
.ValidateOnStart();
await host.StartAsync();
시작이 완료되기 전에 비동기 유효성 검사기만 있는 옵션에 대한 동기 액세스를 방지합니다. 이 지침은 IOptions<TOptions>.Value, IOptionsMonitor<TOptions>.CurrentValue, IOptionsSnapshot<TOptions>.GetIOptionsMonitor<TOptions>.GetIOptionsSnapshot<TOptions>.ValueIOptionsFactory<TOptions>.Create및 에 적용됩니다.
일부 경로는 사용 ValidateOnStart후에도 동기 상태로 유지됩니다. 시작 시 유효성 검사는 후속 범위에 대한 IOptionsMonitor<TOptions> 값을 초기값으로 설정하지 않으며, 구성 변경 후 IOptionsSnapshot<TOptions>는 옵션을 동기적으로 다시 생성합니다. 유효성을 성공적으로 검사하기 위해 해당 경로가 필요한 경우 하나 이상의 동기 유효성 검사기를 유지합니다.
IAsyncValidateOptions<TOptions>를 직접 구현하는 경우 상속된 Validate(string? name, TOptions options) 메서드를 추가하고 .NET 11을 대상으로 다시 컴파일하세요. 유효성 검사기가 적용되지 않을 때 반환 ValidateOptionsResult.Skip 하거나 동기 유효성 검사가 지원되지 않는 경우 반환 ValidateOptionsResult.Fail 합니다.
코드가 제거된 in TOptions 반공변성에 의존하는 경우, 영향을 받는 할당, 형 변환 또는 등록을 업데이트하세요.
AppContext 스위치 또는 구성 설정을 사용하여 이 동작을 제어할 수 없습니다.
영향을 받는 API
- IAsyncValidateOptions<TOptions>
- IValidateOptions<TOptions>
- AsyncValidateOptions<TOptions>
- AsyncValidateOptions<TOptions,TDep>
- AsyncValidateOptions<TOptions,TDep1,TDep2>
- AsyncValidateOptions<TOptions,TDep1,TDep2,TDep3>
- AsyncValidateOptions<TOptions,TDep1,TDep2,TDep3,TDep4>
- AsyncValidateOptions<TOptions,TDep1,TDep2,TDep3,TDep4,TDep5>
- Value
- CurrentValue
- Get
- Get
- Create
- Create
-
ValidateAsyncOptionsBuilder<TOptions>의 확장 메서드
.NET