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:
-
Uso de interfaces e classes abstratas
- As dependências são declaradas através de interfaces, não implementações concretas.
-
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.
-
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.
-
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.