Udostępnij za pośrednictwem


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 (service1w poniższym przykładzie) nie została zarejestrowana jako usługa kluczy, ale została zarejestrowana jako typ usługi niekluczanej (IServicew 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.

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.

Dotyczy interfejsów API