Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Från och med .NET 11 RC 1 misslyckas synkron åtkomst till en alternativtyp som endast använder asynkrona validatorer snabbt. I stället för att returnera en alternativinstans utan asynkron validering genererar sökvägen för synkron skapande en OptionsValidationException.
Version som introducerades
.NET 11 RC 1
Tidigare beteende
Tidigare var i .NET 11 Preview 6 och Preview 7 IAsyncValidateOptions<TOptions> oberoende av IValidateOptions<TOptions>. Asynkrona validatorer körde endast via den asynkrona sökvägen för startvalidering.
När du har använt en asynkron verifierad alternativtyp via en synkron skapandesökväg, till exempel IOptions<TOptions>.Value, CurrentValue, GetIOptionsSnapshot<TOptions>.Value, Get, eller Create, kördes inte den asynkrona validatorn. Den synkrona sökvägen returnerade en instans av ovaliderade alternativ.
Typer som direkt implementerade IAsyncValidateOptions<TOptions> behövde bara implementera ValidateAsync.
Nytt beteende
Från och med .NET 11 RC 1, IAsyncValidateOptions<TOptions> härleds från IValidateOptions<TOptions>, och gränssnittet är inte längre kontravariant. Asynkrona validatorer deltar i samma valideringssamling som synkrona validatorer.
När du kommer åt en alternativtyp med endast asynkrona validatorer via en synkron skapandesökväg returnerar den ärvda Validate metoden en misslyckad ValidateOptionsResult.
Create sedan kastar en OptionsValidationException. Med undantagsmeddelandet uppmanas du att anropa ValidateOnStart och slutföra starten innan du synkront kommer åt alternativen.
Anpassade typer som implementerar IAsyncValidateOptions<TOptions> direkt måste nu även implementera den ärvda metoden Validate.
Typ av kompatibilitetsbrytande ändring
Den här ändringen är en beteendeförändring och kan påverka källkompatibiliteten. I ett smalt scenario där en binär förhandsversion implementeras IAsyncValidateOptions<TOptions> direkt utan omkompilering kan ändringen även påverka binär kompatibilitet.
Orsak till ändringen
Validering av asynkrona alternativ introducerades i .NET 11 Förhandsversion 6 som en valideringssökväg endast för start. Senare designarbete för validering efter start avslöjade ett korrekthetsgap: Alternativen har också synkrona skapande- och åtkomstsökvägar. En validator som endast implementerade asynkront gränssnitt kunde inte köras via dessa synkrona sökvägar, så ogiltiga alternativ kunde returneras och cachelagras innan asynkron validering kördes.
Om du vill stänga det gapet innan API:et når en stabil version IAsyncValidateOptions<TOptions> härleds nu från IValidateOptions<TOptions>. Det enhetliga kontraktet behåller en validatorsamling, bevarar registreringsordningen och gör att synkron åtkomst som inte stöds misslyckas med ett åtgärdsbart undantag. Mer information finns i dotnet/runtime#131197 och det godkända API-förslaget.
Rekommenderad åtgärd
För alternativ som endast använder asynkrona validatorer anropar ValidateOnStart du och slutför värdstarten innan du kommer åt alternativen synkront:
services.AddOptions<MyOptions>()
.Configure(o => o.Value = 42)
.ValidateAsync(o => Task.FromResult(o.Value > 0), "Value must be positive.")
.ValidateOnStart();
await host.StartAsync();
Undvik synkron åtkomst till alternativ med endast asynkrona validatorer innan start slutförs. Den här vägledningen gäller för IOptions<TOptions>.Value, IOptionsMonitor<TOptions>.CurrentValue, IOptionsMonitor<TOptions>.Get, IOptionsSnapshot<TOptions>.Valueoch IOptionsSnapshot<TOptions>.GetIOptionsFactory<TOptions>.Create.
Vissa sökvägar förblir synkrona även efter att du har använt ValidateOnStart. Startverifieringen anger IOptionsSnapshot<TOptions> inte värden för senare omfång och IOptionsMonitor<TOptions> återskapar alternativen synkront efter en konfigurationsändring. Om du behöver att dessa sökvägar valideras korrekt bör du behålla minst en synkron validerare.
Om du implementerar IAsyncValidateOptions<TOptions> direkt lägger du till den ärvda Validate(string? name, TOptions options) metoden och kompilera om mot .NET 11. Returnera ValidateOptionsResult.Skip när validatorn inte gäller eller returnera ValidateOptionsResult.Fail när synkron validering inte stöds.
Om koden byggde på den borttagna kontravariansen in TOptions, uppdatera de berörda tilldelningarna, typomvandlingarna eller registreringarna.
Du kan inte styra det här beteendet med en AppContext-växel eller konfigurationsinställning.
Berörda API:er
- 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
-
ValidateAsynctilläggsmetoder förOptionsBuilder<TOptions>.