FromKeyedServicesAttribute nie wprowadza już parametru bez klucza
Jeśli używasz FromKeyedServicesAttribute polecenia , aby określić usługę kluczy do wstrzyknięcia, może zostać przekazana nieprawidłowa usługa.
Poprzednie zachowanie
Wcześniej, gdy usługa kluczy miała zostać wstrzyknięta jako parametr w konstruktorze usługi przy użyciu polecenia FromKeyedServicesAttribute i odpowiadająca mu usługa kluczowa (service1
w poniższym przykładzie) nie została zarejestrowana jako usługa kluczy, ale została zarejestrowana jako typ usługi niekluczanej (IService
w poniższym przykładzie), usługa niekluczęta została wstrzyknięta zamiast zgłaszać wyjątek.
public MyService([FromKeyedServices("service1")] IService service1, ...
Nowe zachowanie
Począwszy od platformy .NET 9, element jest zgłaszany, InvalidOperationException gdy FromKeyedServicesAttribute jest używany, a określona usługa kluczy nie zostanie znaleziona. To zachowanie jest zgodne z innymi przypadkami, gdy żądana usługa nie może być znaleziona z powodu braku rejestracji.
Wprowadzona wersja
Obsługa programów .NET 9 RC 1 i 8.0.9
Typ zmiany powodującej niezgodność
Ta zmiana jest zmianą behawioralną.
Przyczyna wprowadzenia zmiany
Ta zmiana dodaje brakującą logikę walidacji w celu wykrywania błędów nieprawidłowej konfiguracji usługi. Ten problem istniał, gdy funkcja usługi kluczy została dodana w wersji 8.0.
Zalecana akcja
Jeśli FromKeyedServicesAttribute
jest używany, upewnij się, że odpowiednia usługa jest zarejestrowana jako usługa z kluczem, na przykład przy użyciu IServiceCollection.AddKeyedScoped()
metody , IServiceCollection.AddKeyedSingleton()
lub IServiceCollection.AddKeyedTransient()
.
Poprawka została również przywrócona do platformy .NET 8.0.9, więc zarówno .NET 8, jak i .NET 9 mają takie samo zachowanie. Jeśli aplikacja zależy od starego zachowania, dodano przełącznik funkcji dla platformy .NET 8.0.9 (ale nie .NET 9) o nazwie Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
. Ustaw przełącznik , aby true
zachować stare zachowanie.