FromKeyedServicesAttribute injecteert geen niet-sleutelparameter meer
Wanneer u een FromKeyedServicesAttribute sleutelservice opgeeft die moet worden geïnjecteerd, kan er een onjuiste service worden doorgegeven.
Vorig gedrag
Voorheen werd een sleutelservice niet geregistreerd als een sleutelservice, maar werd geregistreerd als FromKeyedServicesAttribute een niet-sleutelservicetype (in het volgende voorbeeld) enservice1
werd de service zonder sleutel (in het volgende voorbeeld) geregistreerd als een sleutelservice, maar is geregistreerd als een niet-sleutelservicetype (IService
in het volgende voorbeeld), werd de niet-sleutelservice geïnjecteerd in plaats van een uitzondering te genereren.
public MyService([FromKeyedServices("service1")] IService service1, ...
Nieuw gedrag
Vanaf .NET 9 wordt er een InvalidOperationException gegenereerd wanneer FromKeyedServicesAttribute deze wordt gebruikt en de opgegeven sleutelservice niet wordt gevonden. Dit gedrag is consistent met andere gevallen wanneer de aangevraagde service niet kan worden gevonden vanwege een gebrek aan registratie.
Versie geïntroduceerd
Onderhoud van .NET 9 RC 1 en 8.0.9
Type wijziging die fouten veroorzaken
Deze wijziging is een gedragswijziging.
Reden voor wijziging
Met deze wijziging wordt ontbrekende validatielogica toegevoegd om fouten in de onjuiste configuratie van de service te detecteren. Dit probleem bestond toen de sleutelservicefunctie werd toegevoegd in v8.0.
Aanbevolen actie
Als FromKeyedServicesAttribute
deze wordt gebruikt, moet u ervoor zorgen dat de bijbehorende service is geregistreerd als een sleutelservice, zoals met behulp van IServiceCollection.AddKeyedScoped()
, IServiceCollection.AddKeyedSingleton()
of IServiceCollection.AddKeyedTransient()
.
De oplossing is ook teruggezet naar .NET 8.0.9, dus zowel .NET 8 als .NET 9 hebben hetzelfde gedrag. Als uw toepassing afhankelijk is van het oude gedrag, is er een functieswitch toegevoegd voor .NET 8.0.9 (maar niet .NET 9) met de naam Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
. Stel de schakeloptie in om true
het oude gedrag te behouden.