Condividi tramite


Risolvere i problemi in GetKeyedService() e GetKeyedServices() con AnyKey

Il comportamento dei GetKeyedService(IServiceProvider, Type, Object) metodi e GetKeyedServices(IServiceProvider, Type, Object) nella Microsoft.Extensions.DependencyInjection libreria è stato aggiornato per risolvere le incoerenze nella gestione della KeyedService.AnyKey registrazione. In particolare:

  • GetKeyedService() ora genera un'eccezione quando si tenta di risolvere un singolo servizio usando KeyedService.AnyKey come chiave di ricerca.
  • GetKeyedServices() (plurale) non restituisce AnyKey più registrazioni quando viene eseguita una query con KeyedService.AnyKey.

Versione introdotta

.NET 10

Comportamento precedente

In precedenza, la chiamata GetKeyedService() con KeyedService.AnyKey ha restituito una registrazione del servizio associata a AnyKey. Questo comportamento è incoerente con la semantica prevista, perché AnyKey è destinato a rappresentare un caso speciale di servizi con chiave anziché una registrazione specifica.

Chiamare GetKeyedServices() con KeyedService.AnyKey ha restituito tutte le registrazioni per AnyKey. Questo comportamento era anche incoerente con la semantica prevista, perché AnyKey non è destinato ad enumerare tutti i servizi chiave.

Nuovo comportamento

A partire da .NET 10, la chiamata GetKeyedService() con KeyedService.AnyKey genera un'eccezione InvalidOperationException. Ciò garantisce che AnyKey non possa essere usato per risolvere un singolo servizio, perché è destinato a rappresentare un caso speciale anziché una chiave specifica.

var service = serviceProvider.GetKeyedService(typeof(IMyService), KeyedService.AnyKey);
// Throws InvalidOperationException: "Cannot resolve a single service using AnyKey."

Inoltre, la chiamata GetKeyedServices() con KeyedService.AnyKey non restituisce più registrazioni per AnyKey. Al contrario, è conforme alla semantica aggiornata in cui AnyKey viene trattato come caso speciale e non enumera i servizi.

var services = serviceProvider.GetKeyedServices(typeof(IMyService), KeyedService.AnyKey);
// Returns only services that were registered with a specific key.

Tipo di cambiamento che interrompe la compatibilità

Questa modifica è una modifica funzionale.

Motivo della modifica

Il comportamento precedente di GetKeyedService() e GetKeyedServices() con KeyedService.AnyKey era incoerente con la semantica prevista di AnyKey. Le modifiche sono state introdotte in:

  • Assicurarsi che AnyKey venga trattato come caso speciale e non possa essere usato per risolvere un singolo servizio.
  • Impedire a GetKeyedServices() di restituire AnyKey registrazioni quando viene interrogato con AnyKey.

Questi aggiornamenti migliorano la prevedibilità e la Microsoft.Extensions.DependencyInjection correttezza del comportamento della libreria quando si lavora con i servizi chiave. Per altri dettagli, vedere la richiesta pull e il commit di merge associato.

Se si usa GetKeyedService() o GetKeyedServices() con KeyedService.AnyKey, esaminare il codice e aggiornarlo per usare chiavi specifiche anziché AnyKey:

  • Aggiornare le chiamate GetKeyedService(KeyedService.AnyKey) per passare chiavi specifiche o utilizzare una logica alternativa per gestire la risoluzione dei servizi.
  • Aggiornare GetKeyedServices(KeyedService.AnyKey) le chiamate per passare chiavi specifiche o usare logica alternativa per enumerare solo i servizi che si intende recuperare.

Le API interessate

Vedere anche