4

Entendendo DIP, DI, IoC, IoC Containers

#.NET Core #C#
Carlos Olivieri
Carlos Olivieri

Voce sabe a diferença entre esses conceitos avançados de Orientação a Objetos? Todos esses mecanismos, em conjunto, visam obtermos softwares menos acoplados, garantindo manutenibilidade, escalabilidade etc.


DI (Dependency Injection): É um design pattern. Uma classe dependente deve receber o objeto da classe da qual depende.


Exemplo de injeção de dependencia via construtor da classe:


public class CustomerBusinessLogic
{
    ICustomerDataAccess _dataAccess;

    public CustomerBusinessLogic(ICustomerDataAccess custDataAccess)
    {
        _dataAccess = custDataAccess;
    }

    public string GetCustomerData(int id)
    {
        return _dataAccess.GetCustomerName(id);
    }
}


DIP (Dependency Inversion Principle): É a ultima letra dos principios SOLID. É um principio de design que diz que modulos de alto nivel nao devem depender daqueles de nivel mais baixo. Ambos devem depender de abstrações, ou seja, isso normalmente é alcançado usando-se interfaces, nao classes diretamente.


Exemplo de inversão de dependencia:


public interface ICustomerDataAccess
{
    string GetCustomerName(int id);
}

public class CustomerDataAccess: ICustomerDataAccess
{
    public CustomerDataAccess() {
    }

    public string GetCustomerName(int id) {
        return "Dummy Customer Name";        
    }
}

public class DataAccessFactory
{
    public static ICustomerDataAccess GetCustomerDataAccessObj() 
    {
        return new CustomerDataAccess();
    }
}

public class CustomerBusinessLogic
{
    ICustomerDataAccess _custDataAccess;

    public CustomerBusinessLogic()
    {
        _custDataAccess = DataAccessFactory.GetCustomerDataAccessObj();
    }

    public string GetCustomerName(int id)
    {
        return _custDataAccess.GetCustomerName(id);
    }
}


IoC (Inversion of Control): É um principio de design. No exemplo acima, está ocorrendo a inversão de controle por meio da injeção de dependencia. A classe CustomerBusinessLogic não está instanciando a classe que implementa a interface ICustomerDataAccess, isso foi delegado a algum agente externo que cumpra esse papel. Martin Fowler chamou isso de principio de Hollywood: "Não ligue para nós, nós ligaremos pra você.".


Existem varios IoC Containers disponiveis, que sao frameworks que gerenciam/automatizam a inversão de controle pra nós. O .NET Core já tem suporte proprio a um IoC Container, mas provavelmente o mais usado é o Autofac.


Caso tenha interesse em estudar um projeto que utiliza esses mecanismos, visando o baixo acoplamento e possibilitando a mudança de um dos modulos do software (interface de usuario), com minimo impacto nos outros modulos, voce poderá encontrá-lo aqui:


  1. IoC, DIP, DI, Layers, Introduction to software (design and architecture) principles.




2
528

Comentários (2)

2
Claudinei Nobrega

Claudinei Nobrega

23/01/2021 10:35

Parabéns pelo post Carlos !

1
Afonso Simão

Afonso Simão

23/01/2021 12:47

Excelente artigo.

Parabéns Carlos!

https://about.me/cadutech

Brasil