Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Zachowanie metod GetKeyedService(IServiceProvider, Type, Object) i GetKeyedServices(IServiceProvider, Type, Object) w bibliotece Microsoft.Extensions.DependencyInjection zostało zaktualizowane w celu rozwiązania niespójności w obsłudze rejestracji KeyedService.AnyKey. W szczególności GetKeyedService() teraz zgłasza wyjątek podczas próby rozwiązania pojedynczej usługi, używając KeyedService.AnyKey jako klucza odnośnika, a GetKeyedServices() (liczba mnoga) nie zwraca rejestracji AnyKey podczas wykonywania zapytania za pomocą KeyedService.AnyKey.
Wersja wprowadzona
.NET 10
Poprzednie zachowanie
Wcześniej wywołanie GetKeyedService() z KeyedService.AnyKey zwróciło rejestrację usługi skojarzoną z AnyKey. To zachowanie było niespójne z zamierzonym znaczeniem, ponieważ AnyKey reprezentuje specjalny przypadek usług z kluczem, a nie określoną rejestrację.
Wywołanie metody GetKeyedServices() z KeyedService.AnyKey zwróciło wszystkie rejestracje dla elementu AnyKey. To zachowanie było również niezgodne z zamierzoną semantyką, ponieważ AnyKey nie jest przeznaczone do wyliczania wszystkich usług z kluczami.
Nowe zachowanie
Począwszy od platformy .NET 10, wywoływanie metody GetKeyedService() z elementem KeyedService.AnyKey zgłasza błąd InvalidOperationException. To zapewnia, że AnyKey nie może być użyte do rozwiązywania pojedynczej usługi, ponieważ jest przeznaczone do reprezentowania specjalnego przypadku, a nie określonego klucza.
var service = serviceProvider.GetKeyedService(typeof(IMyService), KeyedService.AnyKey);
// Throws InvalidOperationException: "Cannot resolve a single service using AnyKey."
Ponadto wywołanie metody GetKeyedServices()KeyedService.AnyKey nie zwraca już rejestracji dla AnyKey. Zamiast tego stosuje się do zaktualizowanej semantyki, w której AnyKey jest traktowana jako szczególny przypadek i nie wylicza usług.
var services = serviceProvider.GetKeyedServices(typeof(IMyService), KeyedService.AnyKey);
// Returns an empty collection.
Typ zmiany przełamującej
Ta zmiana jest zmianą behawioralną.
Przyczyna zmiany
Poprzednie zachowanie elementu GetKeyedService() i GetKeyedServices() z KeyedService.AnyKey było niespójne z zamierzonymi semantykami elementu AnyKey. Wprowadzono zmiany w celu zapewnienia, że AnyKey jest traktowane jako szczególny przypadek i nie można go użyć do rozwiązania pojedynczej usługi oraz aby uniemożliwić GetKeyedServices() zwracanie rejestracji AnyKey podczas wykonywania zapytań za pomocą polecenia AnyKey. Te aktualizacje zwiększają przewidywalność i poprawność działania Microsoft.Extensions.DependencyInjection biblioteki podczas pracy z usługami z kluczami. Aby uzyskać więcej informacji, zobacz żądanie ściągnięcia i skojarzone zatwierdzenie scalania.
Zalecana akcja
Jeśli używasz elementu GetKeyedService() lub GetKeyedServices() z KeyedService.AnyKey, przejrzyj kod i zaktualizuj go, aby używać określonych kluczy zamiast AnyKey.
W przypadku GetKeyedService(KeyedService.AnyKey) zastąp wywołania do GetKeyedService() na KeyedService.AnyKey używając określonych kluczy lub alternatywnej logiki do obsługi rozwiązywania usług.
Dla GetKeyedServices(KeyedService.AnyKey) zastąp wywołania GetKeyedServices() wywołaniami KeyedService.AnyKey używającymi określonych kluczy lub zaktualizuj swoją logikę, aby wyliczać tylko te usługi, które chcesz pobrać.