Compartilhar via


ActivatorUtilities.CreateInstance se comporta de forma consistente

O comportamento de ActivatorUtilities.CreateInstance agora é mais consistente com CreateFactory(Type, Type[]). Quando IServiceProviderIsService não está presente no contêiner de injeção de dependência (DI), CreateInstance recorre à lógica CreateFactory(Type, Type[]). Nessa lógica, apenas um construtor tem permissão para corresponder a todos os parâmetros de entrada fornecidos.

No caso mais geral, quando IServiceProviderIsService estiver presente, a API CreateInstance prefere a sobrecarga de construtor mais longa que tenha todos os seus argumentos disponíveis. Os argumentos podem ser inseridos na API, registrados no contêiner ou disponíveis em valores padrão no próprio construtor.

Considere a seguinte definição de classe mostrando dois construtores:

public class A
{
   A(B b, C c, string st = "default string") { }
   A() { }
}

Para essa definição de classe, e quando IServiceProviderIsService está presente, ActivatorUtilities.CreateInstance<A>(serviceProvider, new C()) cria uma instância de A escolhendo o primeiro construtor que usa B, C e string.

Versão introduzida

.NET 8 versão prévia 1

Comportamento anterior

ActivatorUtilities.CreateInstance se comportou inesperadamente em alguns casos. Ele verificou se todas as instâncias necessárias passadas para ele existiam no construtor escolhido. No entanto, a seleção do construtor tinha um bug e não era confiável.

Novo comportamento

CreateInstance tenta localizar o construtor mais longo que corresponde a todos os parâmetros com base no comportamento de IServiceProviderIsService.

Observação

Se IServiceProviderIsService estiver configurado incorretamente ou não existir, CreateInstance poderá funcionar de forma incorreta ou ambígua.

Tipo de mudança disruptiva

Esta é uma alteração comportamental.

Motivo da alteração

Essa alteração foi introduzida para corrigir um bug em que o comportamento foi alterado dependendo da ordem das definições de sobrecarga do construtor.

Se seu aplicativo começar a se comportar de forma diferente ou gerar uma exceção após a atualização para o .NET 8, examine cuidadosamente as definições de construtor para o tipo de instância afetado. Consulte a seção Novo comportamento .

APIs afetadas

Consulte também