Sobes.tech
Middle

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.