Teilen über


Beheben von Problemen in GetKeyedService() und GetKeyedServices() mit AnyKey

Das Verhalten der GetKeyedService(IServiceProvider, Type, Object) Und GetKeyedServices(IServiceProvider, Type, Object) Methoden in der Microsoft.Extensions.DependencyInjection Bibliothek wurde aktualisiert, um Inkonsistenzen bei der Behandlung der KeyedService.AnyKey Registrierung zu beheben. Speziell:

  • GetKeyedService() löst nun eine Ausnahme aus, wenn Sie versuchen, einen einzelnen Dienst mit KeyedService.AnyKey als Nachschlageschlüssel aufzulösen.
  • GetKeyedServices() (plural) gibt AnyKey keine Registrierungen mehr zurück, wenn abgefragt mit KeyedService.AnyKey.

Eingeführt in Version

.NET 10

Vorheriges Verhalten

Zuvor hat der Aufruf von GetKeyedService() mit KeyedService.AnyKey eine Dienstregistrierung zurückgegeben, die mit AnyKey verbunden war. Dieses Verhalten war mit der beabsichtigten Semantik inkonsistent, da AnyKey sie einen Sonderfall von Schlüsseldiensten anstelle einer bestimmten Registrierung darstellen soll.

Der Anruf von GetKeyedServices() mit KeyedService.AnyKey hat alle Registrierungen für AnyKey zurückgegeben. Dieses Verhalten war auch mit der beabsichtigten Semantik inkonsistent, da AnyKey nicht alle Schlüsseldienste aufgelistet werden sollen.

Neues Verhalten

Ab .NET 10 führt der Aufruf von GetKeyedService() mit KeyedService.AnyKey zu einem InvalidOperationException. Dadurch wird sichergestellt, dass AnyKey nicht zur Auflösung eines einzelnen Dienstes verwendet werden kann, da er einen Sonderfall anstelle eines bestimmten Schlüssels dargestellt werden soll.

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

Darüber hinaus gibt das Aufrufen von GetKeyedServices() mit KeyedService.AnyKey keine Registrierungen für AnyKey mehr zurück. Stattdessen hält sie sich an die aktualisierte Semantik, wobei AnyKey als Sonderfall behandelt wird und keine Dienste aufgezählt werden.

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

Art der einschneidenden Änderung

Diese Änderung ist eine Verhaltensänderung.

Grund für Änderung

Das vorherige Verhalten von GetKeyedService() und GetKeyedServices() mit KeyedService.AnyKey war inkonsistent mit der beabsichtigten Semantik von AnyKey. Die Änderungen wurden eingeführt in:

  • Stellen Sie sicher, dass AnyKey als Sonderfall behandelt wird und nicht dazu verwendet werden darf, einen einzelnen Dienst zu lösen.
  • Verhindern, dass Registrierungen AnyKey zurückgegeben werden, wenn AnyKey abgefragt wird.

Diese Updates verbessern die Vorhersagbarkeit und Richtigkeit des Verhaltens der Microsoft.Extensions.DependencyInjection Bibliothek beim Arbeiten mit Schlüsseldiensten. Weitere Informationen finden Sie in der Pullanforderung und dem zugeordneten Zusammenführungs-Commit.

Wenn Sie GetKeyedService() mit GetKeyedServices() verwenden, überprüfen Sie Ihren Code und aktualisieren Sie ihn so, dass bestimmte Schlüssel anstelle von KeyedService.AnyKey verwendet werden:AnyKey

  • Aktualisieren Sie GetKeyedService(KeyedService.AnyKey) Aufrufe, um bestimmte Schlüssel zu übergeben, oder verwenden Sie alternative Logik zum Behandeln der Dienstauflösung.
  • Aktualisieren Sie GetKeyedServices(KeyedService.AnyKey) Aufrufe, um bestimmte Schlüssel zu übergeben, oder verwenden Sie alternative Logik, um nur die Dienste auflisten, die Sie abrufen möchten.

Betroffene APIs

Siehe auch