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ística | Activator | ActivatorUtilities |
|---|---|---|
| Parte do .NET Base | Sim | Não |
| Suporte a DI | Não | Sim |
| Uso com ASP.NET Core | Limitado | Ideal |
| Performance | Média | Média |
| Flexibilidade | Alta | Muito Alta |
6. Boas Práticas
- Prefira Injeção de Dependência tradicional sempre que possível
- Use
ActivatorUtilitiesapenas quando a instanciação dinâmica for necessária - Evite uso excessivo de
Activatorem 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