Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis 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. Löst nun eine Ausnahme aus, wenn Sie versuchen, einen einzelnen Dienst mithilfe von GetKeyedService() als Nachschlageschlüssel aufzulösen, und GetKeyedServices() (Plural) gibt keine AnyKey Registrierungen mehr zurück, wenn mit KeyedService.AnyKey abgefragt.
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 dieses einen Sonderfall anstelle eines spezifischen Schlüssels darstellen 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 an empty collection.
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, um sicherzustellen, dass AnyKey als Sonderfall behandelt wird und nicht zur Auflösung eines einzelnen Dienstes verwendet werden kann, und um zu verhindern, dass GetKeyedServices() bei einer Abfrage mit AnyKeyAnyKey-Registrierungen zurückgibt. 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() oder GetKeyedServices() mit KeyedService.AnyKey verwenden, überprüfen Sie Ihren Code und aktualisieren Sie ihn, um bestimmte Schlüssel anstelle von AnyKey zu verwenden.
Ersetzen Sie für GetKeyedService(KeyedService.AnyKey) Aufrufe von GetKeyedService() durch KeyedService.AnyKey mit bestimmten Schlüsseln oder alternativer Logik zur Behandlung der Dienstauflösung.
Ersetzen Sie in GetKeyedServices(KeyedService.AnyKey) Aufrufe von GetKeyedServices() mit KeyedService.AnyKey durch solche, die bestimmte Schlüssel verwenden, oder aktualisieren Sie die Logik, damit nur die Dienste abgerufen werden, die Sie benötigen.