Para que serve a injeção de dependências (Dependency Injection)?
sobes.tech IA
Resposta da IA
A injeção de dependências (Dependency Injection, DI) é usada para gerir as dependências entre componentes de uma aplicação.
Objetivos principais do DI:
- Redução do acoplamento: Os componentes não criam as suas dependências diretamente, mas recebem-nas de fora. Isto torna os componentes mais independentes e facilita a sua reutilização.
- Melhoria da testabilidade: Testar componentes isoladamente torna-se mais fácil, pois podem ser usados objetos mock ou simulações em vez de dependências reais.
- Aumento da flexibilidade e extensibilidade: É mais fácil substituir implementações de dependências sem alterar o código dos componentes que as utilizam.
- Simplificação da configuração: As dependências podem ser configuradas de forma centralizada, por exemplo, ao iniciar a aplicação.
Principais abordagens de DI:
-
Injeção através do construtor (Constructor Injection): As dependências são passadas como parâmetros do construtor. É a abordagem mais comum e recomendada, pois garante a disponibilidade de todas as dependências necessárias ao criar o objeto.
// Dependência public interface ILogger { void Log(string message); } // Componente com dependência public class MyService { private readonly ILogger _logger; public MyService(ILogger logger) // Injeção através do construtor { _logger = logger; } public void DoSomething() { _logger.Log("Fazendo algo."); } } -
Injeção através da propriedade (Property Injection): As dependências são estabelecidas através de propriedades públicas. Menos preferido, pois não garante que a dependência será estabelecida.
public class MyService { public ILogger Logger { get; set; } // Injeção através da propriedade public void DoSomething() { Logger?.Log("Fazendo algo."); // Verificação de null } } -
Injeção através do método (Method Injection): As dependências são passadas como parâmetros do método. Usada quando a dependência é necessária apenas para executar um método específico.
public class MyService { public void DoSomething(ILogger logger) // Injeção através do método { logger.Log("Fazendo algo."); } }
A DI muitas vezes é implementada com a ajuda de um contêiner de DI (Inversion of Control Container), que gerencia o ciclo de vida dos objetos e resolve as suas dependências. Exemplos populares de contêineres DI em .NET: Microsoft.Extensions.DependencyInjection (integrado), Autofac, Ninject, Castle Windsor.
A DI é um princípio chave para construir aplicações fáceis de manter, testar e ampliar.