Partager via


FromKeyedServicesAttribute n’injecte plus de paramètre non-clé

Lorsque vous utilisez FromKeyedServicesAttribute pour spécifier un service clé à injecter, un service incorrect pourrait être passé.

Comportement précédent

Auparavant, lorsqu’un service clé devait être injecté en tant que paramètre dans un constructeur de service en utilisant FromKeyedServicesAttribute et que le service clé correspondant (service1 dans l’exemple suivant) n’était pas enregistré en tant que service clé mais était enregistré en tant que type de service non clé (IService dans l’exemple suivant), le service non clé était injecté au lieu de générer une exception.

public MyService([FromKeyedServices("service1")] IService service1, ...

Nouveau comportement

À partir de .NET 9, une InvalidOperationException est générée lorsque FromKeyedServicesAttribute est utilisé et que le service clé spécifié n’est pas trouvé. Ce comportement est cohérent avec les autres cas où le service demandé ne peut pas être trouvé en raison d’un manque d’enregistrement.

Version introduite

.NET 9 RC 1 et la maintenance 8.0.9

Type de changement cassant

Ce changement est un changement de comportement.

Raison du changement

Ce changement ajoute une logique de validation manquante pour détecter les erreurs de configuration des services. Ce problème existait lorsque la fonctionnalité de service clé a été ajoutée dans la version 8.0.

Si FromKeyedServicesAttribute est utilisé, assurez-vous que le service correspondant est enregistré en tant que service clé, par exemple en utilisant IServiceCollection.AddKeyedScoped(), IServiceCollection.AddKeyedSingleton(), ou IServiceCollection.AddKeyedTransient().

La correction a également été rétroportée dans .NET 8.0.9, de sorte que .NET 8 et .NET 9 ont le même comportement. Si votre application dépend de l’ancien comportement, un commutateur de fonctionnalité a été ajouté pour .NET 8.0.9 (mais pas pour .NET 9) nommé Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject. Réglez le commutateur sur true pour conserver l’ancien comportement.

API affectées