Sobes.tech
Middle+

Que abordagens são usadas para cumprir o princípio da inversão de dependências?

sobes.tech IA

Resposta da IA

O Princípio da Inversão de Dependências (Dependency Inversion Principle, DIP) estabelece que:

  • Os módulos de alto nível não devem depender diretamente dos módulos de baixo nível.
  • Ambos os tipos de módulos devem depender de abstrações (por exemplo, interfaces).
  • As abstrações não devem depender dos detalhes, os detalhes devem depender das abstrações.

Para cumprir este princípio em C#, aplicam-se as seguintes abordagens:

  1. Uso de interfaces e classes abstratas

    • As dependências são declaradas através de interfaces, não implementações concretas.
  2. Injeção de dependências (Dependency Injection, DI)

    • As dependências são passadas para a classe de fora (através do construtor, propriedades ou métodos), e não criadas dentro dela.
    • Isto facilita substituir implementações e simplifica os testes.
  3. Inversão de controlo (Inversion of Control, IoC)

    • O controlo da criação e ligação de objetos é transferido para um contêiner ou framework externo.
  4. Uso de contêineres DI

    • Por exemplo, Microsoft.Extensions.DependencyInjection, Autofac, Ninject, etc.
    • Gerenciam o ciclo de vida e a resolução de dependências.

Exemplo de injeção de dependências através do construtor:

public interface ILogger
{
    void Log(string message);
}

public class ConsoleLogger : ILogger
{
    public void Log(string message) => Console.WriteLine(message);
}

public class UserService
{
    private readonly ILogger _logger;

    public UserService(ILogger logger)
    {
        _logger = logger;
    }

    public void CreateUser(string name)
    {
        // lógica de criação de utilizador
        _logger.Log($"Utilizador {name} criado.");
    }
}

Neste exemplo, UserService depende da abstração ILogger, e a implementação concreta ConsoleLogger é passada de fora, o que está de acordo com o princípio de inversão de dependências.