Skip to main content

ActivatorUtilities | Activator | Dependency Injection | CSharp

  • ActivatorUtilities | Activator | Dependency Injection | CSharp

Introdução

No ecossistema .NET, Activator Utilities refere-se principalmente às funcionalidades fornecidas pela classe Activator e pela classe auxiliar ActivatorUtilities (disponível no pacote Microsoft.Extensions.DependencyInjection). Essas utilidades permitem criar instâncias de tipos dinamicamente em tempo de execução, com ou sem integração com Injeção de Dependência (DI).

Esses recursos são amplamente usados em frameworks como ASP.NET Core, bibliotecas de infraestrutura e cenários onde os tipos não são conhecidos em tempo de compilação.


1. Classe Activator

A classe System.Activator faz parte do .NET desde suas primeiras versões e permite a criação dinâmica de objetos.

1.1 Principais Métodos

  • Activator.CreateInstance(Type type)
  • Activator.CreateInstance(Type type, params object[] args)
  • Activator.CreateInstance<T>()

1.2 Exemplo Básico

Type tipo = typeof(Cliente);
object instancia = Activator.CreateInstance(tipo);

Ou usando genéricos:

Cliente cliente = Activator.CreateInstance<Cliente>();

1.3 Quando Usar

  • Carregamento dinâmico de tipos (reflection)
  • Plugins e arquiteturas extensíveis
  • Frameworks genéricos

1.4 Limitações

  • Não suporta injeção automática de dependências
  • Menor desempenho em comparação à instanciação direta (new)
  • Pode lançar exceções em tempo de execução se o construtor não existir

2. Classe ActivatorUtilities

A classe ActivatorUtilities está disponível no namespace:

Microsoft.Extensions.DependencyInjection

Ela foi criada para funcionar em conjunto com o container de Injeção de Dependência do .NET.

2.1 Objetivo Principal

Permitir a criação de instâncias combinando:

  • Serviços registrados no container de DI
  • Parâmetros passados manualmente

3. Métodos Importantes do ActivatorUtilities

3.1 CreateInstance

Cria uma instância resolvendo dependências automaticamente.

var instancia = ActivatorUtilities.CreateInstance<MeuServico>(serviceProvider);

Com parâmetros adicionais:

var instancia = ActivatorUtilities.CreateInstance<MeuServico>(
serviceProvider,
parametroManual
);

3.2 GetServiceOrCreateInstance

Tenta obter o serviço do container; se não existir, cria uma nova instância.

var servico = ActivatorUtilities.GetServiceOrCreateInstance<MeuServico>(serviceProvider);

4. Exemplo Prático com Injeção de Dependência

public class PedidoService
{
private readonly ILogger<PedidoService> _logger;

public PedidoService(ILogger<PedidoService> logger)
{
_logger = logger;
}
}

Criação dinâmica:

var pedidoService = ActivatorUtilities.CreateInstance<PedidoService>(serviceProvider);

O ILogger<PedidoService> será resolvido automaticamente pelo container.


5. Diferença entre Activator e ActivatorUtilities

CaracterísticaActivatorActivatorUtilities
Parte do .NET BaseSimNão
Suporte a DINãoSim
Uso com ASP.NET CoreLimitadoIdeal
PerformanceMédiaMédia
FlexibilidadeAltaMuito Alta

6. Boas Práticas

  • Prefira Injeção de Dependência tradicional sempre que possível
  • Use ActivatorUtilities apenas quando a instanciação dinâmica for necessária
  • Evite uso excessivo de Activator em código crítico de performance
  • Sempre trate exceções ao criar instâncias dinamicamente

7. Casos de Uso Comuns

  • Middleware dinâmico no ASP.NET Core
  • Frameworks e bibliotecas genéricas
  • Sistemas de plugins
  • Criação de handlers, jobs ou consumers em tempo de execução