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:
Claudinei Nobrega
23/01/2021 10:35