FromKeyedServicesAttribute fügt keinen Nichtschlüsselparameter mehr ein.
Wenn Sie FromKeyedServicesAttribute zum Angeben eines zu injizierenden Schlüssels verwenden, wird möglicherweise ein falscher Dienst übergeben.
Vorheriges Verhalten
Zuvor wurde ein Schlüsseldienst, der als Parameter in einen Dienstkonstruktor mithilfe von FromKeyedServicesAttribute eingefügt werden soll, und der entsprechende Schlüsseldienst (service1
im folgenden Beispiel) nicht als Schlüsseldienst, sondern als nicht schlüsselbasierter Dienst (im folgenden Beispiel) registriert wurde ,IService
anstatt eine Ausnahme auszuwerfen.
public MyService([FromKeyedServices("service1")] IService service1, ...
Neues Verhalten
Ab .NET 9 wird ein InvalidOperationException ausgelöst, wenn FromKeyedServicesAttribute verwendet wird und der angegebene Schlüsseldienst nicht gefunden wird. Dieses Verhalten entspricht anderen Fällen, in denen der angeforderte Dienst aufgrund fehlender Registrierung nicht gefunden werden kann.
Eingeführt in Version
.NET 9 RC 1- und 8.0.9-Wartung
Typ des Breaking Changes
Diese Änderung ist eine Verhaltensänderung.
Grund für die Änderung
Diese Änderung fügt fehlende Überprüfungslogik hinzu, um Fehlkonfigurationsfehler des Diensts zu erkennen. Dieses Problem ist aufgetreten, wenn das Schlüsseldienst-Feature in v8.0 hinzugefügt wurde.
Empfohlene Maßnahme
Falls FromKeyedServicesAttribute
verwendet wird, stellen Sie sicher, dass der entsprechende Dienst als Schlüsseldienst registriert ist, z. B. mithilfe von IServiceCollection.AddKeyedScoped()
, IServiceCollection.AddKeyedSingleton()
oder IServiceCollection.AddKeyedTransient()
.
Der Fix wurde auch in .NET 8.0.9 zurückportiert, sodass sowohl .NET 8 als auch .NET 9 das gleiche Verhalten aufweisen. Wenn Ihre Anwendung vom alten Verhalten abhängt, wurde für .NET 8.0.9 (aber nicht .NET 9) ein Featurewechsel namens Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
hinzugefügt. Legen Sie den Schalter auf true
fest, um das alte Verhalten beizubehalten.