FromKeyedServicesAttribute não injeta mais parâmetro não chaveado
Quando você usa FromKeyedServicesAttribute para especificar um serviço com chave a ser injetado, um serviço incorreto pode ser passado.
Comportamento anterior
Anteriormente, quando um serviço com chave se destinava a ser injetado como um parâmetro em um construtor de serviço usando FromKeyedServicesAttribute e o serviço com chave correspondente (service1
no exemplo a seguir) não era registrado como um serviço com chave, mas era registrado como um tipo de serviço sem chave (IService
no exemplo a seguir), o serviço sem chave era injetado em vez de lançar uma exceção.
public MyService([FromKeyedServices("service1")] IService service1, ...
Novo comportamento
A partir do .NET 9, um InvalidOperationException é gerado quando FromKeyedServicesAttribute é usado e o serviço com chave especificado não é encontrado. Esse comportamento é consistente com outros casos em que o serviço solicitado não pode ser encontrado devido à falta de registro.
Versão introduzida
Manutenção do .NET 9 RC 1 e 8.0.9
Tipo de alteração interruptiva
Esta é uma alteração comportamental.
Motivo da alteração
Essa alteração adiciona lógica de validação ausente para detectar bugs de configuração incorreta do serviço. Esse problema existia quando o recurso de serviço com chave foi adicionado na v8.0.
Ação recomendada
Se FromKeyedServicesAttribute
for usado, certifique-se de que o serviço correspondente esteja registrado como um serviço com chave, como quando usa IServiceCollection.AddKeyedScoped()
, IServiceCollection.AddKeyedSingleton()
, ou IServiceCollection.AddKeyedTransient()
.
A correção também foi portada para o .NET 8.0.9, portanto, o .NET 8 e o .NET 9 têm o mesmo comportamento. Se o aplicativo depender do comportamento antigo, uma opção de recurso foi adicionada para o .NET 8.0.9 (mas não para o .NET 9) chamada Microsoft.Extensions.DependencyInjection.AllowNonKeyedServiceInject
. Defina a opção para true
para manter o comportamento antigo.