Compartilhar via


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.

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.

APIs afetadas