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.
Action recommandée
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.