Anmerkung
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen, dich anzumelden oder die Verzeichnisse zu wechseln.
Der Zugriff auf diese Seite erfordert eine Genehmigung. Du kannst versuchen , die Verzeichnisse zu wechseln.
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 mitKeyedService.AnyKeyals Nachschlageschlüssel aufzulösen. -
GetKeyedServices()(plural) gibtAnyKeykeine Registrierungen mehr zurück, wenn abgefragt mitKeyedService.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
AnyKeyals Sonderfall behandelt wird und nicht dazu verwendet werden darf, einen einzelnen Dienst zu lösen. - Verhindern, dass Registrierungen
AnyKeyzurückgegeben werden, wennAnyKeyabgefragt 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.
Empfohlene Aktion
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
- Microsoft.Extensions.DependencyInjection.ServiceProviderKeyedServiceExtensions.GetKeyedService(IServiceProvider, Type, Object)
- Microsoft.Extensions.DependencyInjection.ServiceProviderKeyedServiceExtensions.GetKeyedServices(IServiceProvider, Type, Object)