Diferença entre "Injeção de dependência" e "Inversão de controle"

Bom dia,
Alguém poderia dizer qual a diferenca entre “Injeção de dependência” e “Inversão de controle”.
Olhando o conceito de ambos… parecem q sao sinonimos… mas acredito q nao sao…

Obrigado

A bastante tempo atrás já foi discutido isso aqui no guj.

Na prática não tem diferença nenhuma, mas me lembro que teoricamente algumas pessoas apontaram diferenças.

Realmente, cada um tem sua opinião sobre o assunto. Isso envolve três conceitos: inversão de dependência, inversão de controle e injeção de dependência. Na minha opinião é o seguinte:

Inversão de dependência e inversão de controle são princípios de projeto de software orientado a objetos e injeção de dependência é uma técnica para especificar classes concretas de maneira flexível.

Inversão de Dependência: é um termo geral para designar que tanto componentes de alto nível quanto componentes de baixo nível dependem de abstrações. Esse princípio estimula o uso de abstrações em vez de classes concretas. Exemplos de padrões que possibilitam isso: factories.

Inversão de Controle: também chamado de princípio de hollywood, ou seja, “não nos chame, nós chamamos vc”. Exemplo de padrão: template method

Injeção de dependência: é uma técnica utilizada para instanciar classes concretas, sem se manter acoplado a elas. Projetos que usam inversão de dependência e inversão de controle são fáceis de se beneficiar de containeres de injeção de dependência.

Bem, acho q é isso. Se eu estiver errado, por favor me corrijam.

Versão resumida do post anterior:

Inversão de controle é estratégia, injeção de dependência é tática.

Injeção de Dependências é uma formad e Inversão de Controle.

E quais são outras formas de inversão de controle?

[quote=carneiro]E quais são outras formas de inversão de controle?[/quote]Dependency lookup. Exemplo: Registry (JNDI), Factory…

De onde saiu que lookup eh inversao de controle? Se A precisa de B e A vai buscar B, nao eh exatamente invertido :stuck_out_tongue:

Foi o que eu pensei (mas fiquei quieto… vai que sou eu que estou meio por fora do assunto!).

Aliás, todo o auê em cima de IoC e DI surgiu por que ninguem aguentava mais fazer lookups, principalmente quando se trabalhava com as versão antigas de EJB. (< 3.0).

[quote=cv]De onde saiu que lookup eh inversao de controle? Se A precisa de B e A vai buscar B, nao eh exatamente invertido :P[/quote]Imaginei isso porque A não instancia B, C instancia B para A. Já que eu estava errado, quais seriam as outras formas de inversão de controle?

De onde saiu que lookup eh inversao de controle? Se A precisa de B e A vai buscar B, nao eh exatamente invertido :P[/quote]

Ora, a injeção de dependências é simplesmente uma automatização da ida ao registro pra pegar o objeto. A inversão de controle não interessa como eu peguei, o importante é eu não criar o objeto diretamente.

Inversao de controle = principio de Hollywood = “don’t call us, we’ll call you”. :slight_smile:

Trata-se de uma caracteristica comum a diversos frameworks, vc coloca o componente la e o framework se encarrega de chama-lo (o principio eh compativel com a ideia de reuso de interacoes presentes nos frameworks - alias, eh peca necessaria).

Conforme disse o Philip, injecao de Dependencias usa Inversao de Controle. Concordo que eh confuso, especialmente porque um batalhao de gente usa o termo “inversao de controle” como referencia a “injecao de dependencias”.

Mais aqui e aqui. Atenção para o quote do Ralph GoF Johnson e do Brian Foote.

Interessa sim. Interessa saber que você não tem uma referência para o Locator. Se tiver, não é DI.

/* Não é DI. Não dá para saber se o getCleverObject criou neste momento
um CleverObject ou reusou um já pronto. E acho que nem é importante.
O problema ali foi a referência ao Service.*/
myObj  = Service.getCleverObject();
myObject.runForest();

Galera, para quem tem dúvidas sobre este assunto, aí vai uma dica muito legal para estudos.

O kara que escreveu isso é simplesmente o papa em desenvolvimento de software e este artigo apresenta uma abordagem mais do que interessante a respeito de IoC ou Injençao de Independência.

Boa leitura!!!

Segue o link para o artigo em português: http://www.javafree.org/content/view.jf?idContent=1