Diferença entre Injeção de Dependência (DI) e Inversão de Controle (IOC)

116

Tenho visto muitas referências de Injeção de Dependência (DI) & Inversion Of Control (IOC), mas não sei se existe diferença entre eles ou não.

Eu gostaria de começar a usar um ou ambos, mas estou um pouco confuso sobre como eles são diferentes.

    
por gnat 26.09.2008 / 14:54
fonte

4 respostas

52

Definições

Inversão de controle é um paradigma de design com o objetivo de reduzir o reconhecimento de implementações concretas do código da estrutura de aplicativo e dar mais controle aos componentes específicos do domínio de sua aplicação. Em um sistema projetado de cima para baixo tradicional, o fluxo lógico do conhecimento da aplicação e da dependência flui dos componentes superiores, os projetados primeiro, para os que foram projetados por último. Como tal, a inversão de controle é uma inversã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 confiam sem saber em tempo de compilação qual implementação será usada para fornecer essa funcionalidade.

Trabalhando juntos

A inversão de 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 ex. 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 a (s) dependência (s) de que precisam.

Exemplos

Um exemplo desses conceitos no trabalho é a estrutura de plug-ins no Refletor . Os plug-ins têm um grande controle do sistema, embora o aplicativo não saiba nada sobre os plug-ins em tempo de compilação. Um único método é chamado em cada um desses plug-ins, Initialize if memory serve, que passa o controle para o plug-in. O framework não sabe o que eles farão, apenas permite que eles façam isso. O controle foi retirado da aplicação principal e dado ao componente que faz o trabalho específico; inversão de controle.

A estrutura de aplicativos permite o acesso à sua funcionalidade por meio de diversos provedores de serviços. Um plug-in recebe referências aos provedores de serviços quando é criado. Essas dependências permitem que o plug-in adicione seus próprios itens de menu, altere a forma como os arquivos são exibidos, exiba suas próprias informações nos painéis apropriados, etc. Como as dependências são transmitidas por interface, as implementações podem mudar e as alterações não quebram o código, desde que o contrato permaneça 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 (no .NET, pelo menos). Hoje, existem ferramentas, MEF para uma, que permitem um intervalo maior de opções ao injetar dependências, incluindo a capacidade de uma estrutura de aplicativos aceitar uma lista de plug-ins como uma dependência.

Resumo

Embora esses conceitos possam ser usados e forneçam benefícios independentemente, juntos permitem que códigos muito mais flexíveis, reutilizáveis e testáveis sejam gravados. Como tal, eles são conceitos importantes no projeto de soluções orientadas a objetos.

    
por 26.09.2008 / 15:22
fonte
0

Bom artigo para entender o IOC e DI link

COI (Inversão de Controle)

IOC significa

  1. codificação para interface (um componente deve depender da interface do outro componente e não do impl) e por exemplo

    interface iComp_2 {...}
    
    class Comp_1 {
        iComp_2 c2 = ….;
    }
    
  2. removendo o código específico da implementação do componente por exemplo

    Comp_1 {
        iComp_2 c2 = getComp_2_Impl(); // not new Comp_2_Impl();
    }
    

O COI pode ser alcançado por um dos seguintes procedimentos:

1. DI (Injeção de Dependência)

3 types of DI

1.1 Constructor Injection

1.2 Setter Injection

1.3 Interface Injection

2. Localizador de serviço

Recipiente DI (Injeção de Dependência)

Determinação do tempo de execução 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 (assim, em tempo de compilação não sabemos qual impl será usado e aumenta a configurabilidade de a aplicação). É uma implementação onde a relação concreta entre diferentes módulos é decidida em "tempo de execução".

Instanciação do impl após injeção de dependência: depois de determinar o impl, ele instancia esse impl, primeiro criando todas as suas dependências (especificadas no arquivo de configuração) e, em seguida, injetando essas dependências nesse impl.

Instância Gerenciamento do ciclo de vida: os contêineres DI geralmente mantêm apenas uma referência aos objetos necessários para gerenciar 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 para o contêiner, o contêiner normalmente apenas se esquece do objeto criado. Caso contrário, o coletor de lixo dificilmente coletaria todos esses objetos quando não fosse mais usado.

    
por 24.03.2013 / 16:09
fonte
-3

Eu diria que "Inversão de Controle" é uma maneira de projetar um sistema no qual todos os módulos são considerados entidades abstratas.

E, "Injeção de Dependência" é uma implementação onde a relação concreta entre os diferentes módulos é decidida em "tempo de execução".

    
por 03.03.2012 / 14:58
fonte
-4

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 deles seja 'chamado'. Em outros ambientes mais estáticos você não tem essa facilidade, então você precisa desse truque para inserir dicas no fluxo de controle.

    
por 26.09.2008 / 15:57
fonte