Eu tenho visto muitas referências de Injeção de Dependência (DI) e Inversão de Controle (COI), mas realmente não sei se existe uma diferença entre elas ou não.
Gostaria de começar a usar um ou os dois, mas estou um pouco confuso sobre como eles são diferentes.
Respostas:
Definições
A inversão do controle é um paradigma de design com o objetivo de reduzir o reconhecimento de implementações concretas a partir do código da estrutura do aplicativo e dar mais controle aos componentes específicos do domínio do seu aplicativo. Em um sistema tradicional de cima para baixo, o fluxo lógico do aplicativo e do reconhecimento de dependência flui dos componentes principais, os projetados primeiro, e os projetados por último. Como tal, a inversão de controle é uma reversão quase literal da conscientização de controle e dependência em um aplicativo.
Injeção de dependência é um padrão usado para criar instâncias de classes nas quais outras classes dependem sem saber em tempo de compilação qual implementação será usada para fornecer essa funcionalidade.
Trabalhando juntos
A inversão do controle pode utilizar a injeção de dependência, pois é necessário um mecanismo para criar os componentes que fornecem a funcionalidade específica. Outras opções existem e são usadas, por exemplo, ativadores, métodos de fábrica, etc., mas as estruturas não precisam fazer referência a essas classes de utilitário quando as classes de estrutura podem aceitar as dependências de que precisam.
Exemplos
Um exemplo desses conceitos em ação é a estrutura de plug-in no Reflector . Os plug-ins têm muito controle do sistema, embora o aplicativo não soubesse nada sobre os plug-ins no momento da compilação. Um único método é chamado em cada um desses plug-ins, Inicialize se a memória servir, que passa o controle para o plug-in. A estrutura não sabe o que eles farão, apenas permite que eles façam. O controle foi retirado da aplicação principal e entregue ao componente que está executando o trabalho específico; inversão de controle.
A estrutura do aplicativo permite acesso a sua funcionalidade por meio de uma variedade de provedores de serviços. Um plug-in recebe referências aos provedores de serviços quando ele é criado. Essas dependências permitem que o plug-in inclua seus próprios itens de menu, altere como os arquivos são exibidos, exiba suas próprias informações nos painéis apropriados, etc. Como as dependências são transmitidas pela interface, as implementações podem mudar e as alterações não quebram o código enquanto o contrato permanecer intacto.
Na época, um método de fábrica era usado para criar os plug-ins usando informações de configuração, reflexão e o objeto Activator (pelo menos no .NET). Hoje, existem ferramentas, MEF para um, que permitem uma gama mais ampla de opções ao injetar dependências, incluindo a capacidade de uma estrutura de aplicativo aceitar uma lista de plug-ins como uma dependência.
Sumário
Embora esses conceitos possam ser usados e oferecer benefícios de forma independente, juntos eles permitem a criação de códigos muito mais flexíveis, reutilizáveis e testáveis. Como tal, são conceitos importantes no design de soluções orientadas a objetos.
fonte
Bom artigo para entender o COI e o DI http://martinfowler.com/articles/injection.html
COI (Inversão de Controle)
COI significa
codificação para interface (um componente deve depender da interface de outro componente e não de impl), e por exemplo
remover o código específico de implementação do componente, por exemplo
O COI pode ser alcançado por um dos seguintes procedimentos:
1. DI (Injeção de Dependência)
2. Localizador de Serviço
Recipiente DI (injeção de dependência)
Determinação de tempo de execução do implemento e não tempo de compilação: determina em tempo de execução qual implementação concreta de uma interface a ser usada com base em algum arquivo de configuração (portanto, no tempo de compilação, não sabemos qual impl será usado e, portanto, aumenta a configurabilidade do aplicativo) . É uma implementação em que a relação concreta entre os diferentes módulos é decidida em "tempo de execução".
Instanciação do impl após a injeção de dependência: após determinar o impl, ele o instancia criando primeiro todas as suas dependências (especificadas no arquivo de configuração) e, em seguida, injetando essas dependências no impl
Gerenciamento do ciclo de vida da instância: os contêineres DI normalmente mantêm apenas uma referência aos objetos para os quais ele precisa gerenciar os ciclos de vida ou que são reutilizados para futuras injeções, como singletons ou flyweights. Quando configurado para criar novas instâncias de alguns componentes para cada chamada ao contêiner, o contêiner geralmente esquece apenas o objeto criado. Caso contrário, o coletor de lixo teria dificuldade em coletar todos esses objetos quando não fosse mais usado.
fonte
Eu diria que "Inversão de controle" é uma maneira de projetar um sistema em que todos os módulos são pensados em entidades abstratas.
E "Injeção de Dependência" é uma implementação em que a relação concreta entre diferentes módulos é decidida em "tempo de execução".
fonte
Inversão de controle é um conceito geral, em linguagens funcionais geralmente é feito usando continuações. Isso permite que você escreva uma API em que ambos os lados sejam 'chamadores' e nenhum seja 'chamado'. Em outros ambientes mais estáticos, você não tem essa facilidade, portanto, precisa desse hack para inserir dicas no fluxo de controle.
fonte