Delen via


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.

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.

Betrokken API's