Eşzamansız olarak doğrulanmış seçeneklere eşzamanlı erişim hata verir

.NET 11 RC 1’den itibaren, yalnızca asenkron doğrulayıcılar kullanan bir seçenek türüne eşzamanlı erişim hemen başarısız olur. Zaman uyumsuz doğrulama olmadan bir seçenek örneği döndürmek yerine, zaman uyumlu oluşturma yolu bir OptionsValidationExceptionoluşturur.

Sürüm kullanıma sunulmuştur

.NET 11 RC 1

Önceki davranış

Daha önce, .NET 11 Önizleme 6 ve Önizleme 7'de IAsyncValidateOptions<TOptions>, IValidateOptions<TOptions>'den bağımsızdı. Eşzamansız doğrulayıcılar yalnızca eşzamansız başlatma doğrulama yolu üzerinden çalıştırıldı.

IOptions<TOptions>.Value, CurrentValue, Get, IOptionsSnapshot<TOptions>.Value, Get veya Create gibi eşzamanlı bir oluşturma yolu üzerinden eşzamansız olarak doğrulanan bir seçenek türüne eriştiğinizde, eşzamansız doğrulayıcı çalıştırılmadı. Zaman uyumlu yol, doğrulanmamış bir seçenek örneği döndürdü.

IAsyncValidateOptions<TOptions>’u doğrudan uygulayan türlerin yalnızca ValidateAsync’i uygulaması gerekiyordu.

Yeni davranış

.NET 11 RC 1’den itibaren, IAsyncValidateOptions<TOptions>, IValidateOptions<TOptions> öğesinden türetilmiştir ve arabirim artık karşı değişken değildir. Zaman uyumsuz doğrulayıcılar, zaman uyumlu doğrulayıcılarla aynı doğrulayıcı koleksiyonuna katılır.

Yalnızca eşzamansız doğrulayıcılar içeren bir seçenek türüne eşzamanlı bir oluşturma yolu üzerinden eriştiğinizde, devralınan Validate yöntemi başarısız bir ValidateOptionsResult döndürür. Create ardından bir OptionsValidationException oluşturur. Özel durum iletisi, seçeneklere eşzamanlı olarak erişmeden önce ValidateOnStart çağırmanız ve başlatma işlemini tamamlamanız gerektiğini belirtir.

IAsyncValidateOptions<TOptions> öğesini doğrudan uygulayan özel türlerin artık devralınan Validate yöntemini de uygulaması gerekir.

Kesinti yaratan değişiklik türü

Bu değişiklik davranışsal bir değişikliktir ve kaynak uyumluluğunu etkileyebilir. Önizleme ikilisinin yeniden derleme olmadan doğrudan uygulandığı IAsyncValidateOptions<TOptions> dar bir senaryoda, değişiklik ikili uyumluluğu da etkileyebilir.

Değişiklik nedeni

Zaman uyumsuz seçenekler doğrulaması, .NET 11 Preview 6'da yalnızca başlangıç doğrulama yolu olarak sunulmuştur. Başlatma sonrası doğrulamaya yönelik sonraki tasarım çalışmaları bir doğruluk açığını ortaya çıkardı: Seçeneklerin de eşzamanlı oluşturma ve erişim yolları vardır. Yalnızca zaman uyumsuz arabirimi uygulayan bir doğrulayıcı bu zaman uyumlu yollarda çalışamadığından, zaman uyumsuz doğrulama çalıştırılmadan önce geçersiz seçenekler döndürülebilir ve önbelleğe alınabiliyordu.

API kararlı bir sürüme ulaşmadan önce bu açığı kapatmak için IAsyncValidateOptions<TOptions>, artık IValidateOptions<TOptions>’den türetiliyor. Birleşik anlaşma tek bir doğrulayıcı koleksiyonu tutar, kayıt sırasını korur ve desteklenmeyen zaman uyumlu erişimin eyleme dönüştürülebilir bir özel durumla başarısız olmasını sağlar. Daha fazla bilgi için bkz. dotnet/runtime#131197 ve onaylanan API teklifi.

Yalnızca eşzamansız doğrulayıcılar kullanan seçenekler için, seçeneklere eşzamanlı olarak erişmeden önce ValidateOnStart öğesini çağırın ve ana bilgisayarın başlatılmasını tamamlayın:

services.AddOptions<MyOptions>()
    .Configure(o => o.Value = 42)
    .ValidateAsync(o => Task.FromResult(o.Value > 0), "Value must be positive.")
    .ValidateOnStart();

await host.StartAsync();

Yalnızca eşzamansız doğrulayıcıları olan seçeneklere, başlatma işlemi tamamlanmadan önce eşzamanlı olarak erişmekten kaçının. Bu kılavuz , , IOptionsMonitor<TOptions>.CurrentValue, IOptionsMonitor<TOptions>.Get, IOptionsSnapshot<TOptions>.Valueve IOptionsSnapshot<TOptions>.GetIOptionsFactory<TOptions>.Createiçin geçerlidirIOptions<TOptions>.Value.

ValidateOnStart kullandıktan sonra bile bazı yollar eşzamanlı kalır. Başlangıç doğrulaması, sonraki kapsamlar için IOptionsSnapshot<TOptions> değerlerini başlatmaz ve IOptionsMonitor<TOptions>, bir yapılandırma değişikliğinden sonra seçenekleri eşzamanlı olarak yeniden oluşturur. Bu yolların başarıyla doğrulanmasını istiyorsanız, en az bir eşzamanlı doğrulayıcı bulundurun.

IAsyncValidateOptions<TOptions> öğesini doğrudan uygularsanız, devralınan Validate(string? name, TOptions options) yöntemini ekleyin ve .NET 11’e göre yeniden derleyin. Doğrulayıcı geçerli olmadığında ValidateOptionsResult.Skip , eşzamanlı doğrulama desteklenmediğinde ise ValidateOptionsResult.Fail döndürün.

Kodunuz kaldırılan in TOptions karşı varyansa dayanıyorsa, etkilenen atamaları, tür dönüştürmelerini veya kayıtları güncelleştirin.

AppContext anahtarı veya yapılandırma ayarıyla bu davranışı denetleyemezsiniz.

Etkilenen API'ler