FromKeyedServicesAttribute non inserisce più un parametro non con chiave
Quando si usa FromKeyedServicesAttribute per specificare un servizio con chiave da inserire, potrebbe essere passato un servizio non corretto.
Comportamento precedente
In precedenza, quando un servizio con chiave era destinato a essere inserito come parametro in un costruttore del servizio usando FromKeyedServicesAttribute e il servizio con chiave corrispondente (service1
nell'esempio seguente) non era registrato come servizio con chiave, ma è stato registrato come tipo di servizio non con chiave (IService
nell'esempio seguente), il servizio non con chiave è stato inserito invece di generare un'eccezione.
public MyService([FromKeyedServices("service1")] IService service1, ...
Nuovo comportamento
A partire da .NET 9, viene generata un'eccezione InvalidOperationException quando viene usato FromKeyedServicesAttribute e il servizio con chiave specificato non viene trovato. Questo comportamento è coerente con altri casi, in cui non è possibile trovare il servizio richiesto a causa della mancanza di registrazione.
Versione introdotta
Manutenzione di .NET 9 RC 1 e 8.0.9
Tipo di modifica che causa un'interruzione
Questa è una modifica funzionale.
Motivo della modifica
Questa modifica aggiunge la logica di convalida mancante per rilevare bug di configurazione errata del servizio. Questo problema si è verificato quando la funzionalità del servizio con chiave è stata aggiunta nella versione 8.0.
Azione consigliata
Se viene usato FromKeyedServicesAttribute
, assicurarsi che il servizio corrispondente venga registrato come servizio con chiave, ad esempio usando IServiceCollection.AddKeyedScoped()
IServiceCollection.AddKeyedSingleton()
o IServiceCollection.AddKeyedTransient()
.
La correzione è stata anche sottoposta a backporting in .NET 8.0.9, quindi .NET 8 e .NET 9 hanno lo stesso comportamento. Se l'applicazione dipende dal comportamento precedente, è stata aggiunta un'opzione di funzionalità per .NET 8.0.9 (ma non .NET 9), denominata Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
. Impostare l'opzione su true
per mantenere il comportamento precedente.