FromKeyedServicesAttribute ya no inserta un parámetro sin clave
Cuando se usa FromKeyedServicesAttribute para indicar un servicio con clave que se va a insertar, es posible que se active un servicio incorrecto.
Qué pasaba antes
Anteriormente, cuando se utilizaba un servicio con clave para insertarse como parámetro en un constructor de servicio mediante FromKeyedServicesAttribute y el servicio con clave correspondiente (service1
en el ejemplo siguiente) no se registraba como un servicio con clave, sino que se registraba como un tipo de servicio sin clave (IService
en el ejemplo siguiente), por lo que el servicio sin clave se insertaba en lugar de generar una excepción.
public MyService([FromKeyedServices("service1")] IService service1, ...
Nuevo funcionamiento
A partir de .NET 9, se genera una excepción InvalidOperationException cuando se usa FromKeyedServicesAttribute y no se encuentra el servicio con clave correspondiente. Este funcionamiento es el mismo en otros casos donde no se encuentra el servicio solicitado debido a que no hay un registro.
Versión introducida
Mantenimiento de .NET 9 RC 1 y 8.0.9
Tipo de cambio importante
Este es un cambio de funcionamiento.
Motivo del cambio
Este cambio agrega la lógica de validación que falta para detectar errores de configuración incorrecta del servicio. Este problema surgía cuando se añadió la característica de servicio con clave en la versión v8.0.
Acción recomendada
Si se usa FromKeyedServicesAttribute
, asegúrese de que el servicio correspondiente esté registrado como un servicio con clave, como cuando se usa IServiceCollection.AddKeyedScoped()
, IServiceCollection.AddKeyedSingleton()
o IServiceCollection.AddKeyedTransient()
.
La corrección también se ha reintegrado en .NET 8.0.9, por lo que en .NET 8 y .NET 9 el funcionamiento es el mismo. Si la aplicación depende del procedimiento anterior, se ha agregado un modificador de la característica para .NET 8.0.9 (pero no .NET 9) denominado Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
. Cambie el modificador a true
para mantener el procedimiento anterior.