none
Injeção de dependencia vs inversão de controle RRS feed

  • Pergunta

  • Olá galera,

    1) Qual a diferente de "Injeção de dependencia" de "inversão de controle"? 

    2) A microsoft recentemente lançou o MEF "Managed Extensibility Framework" e li em um artigo que esse framework usa esses dois conceitos, porem lendo sobre ambos eu não consegui entender claramente em qual momento o MEF usa esses conceitos... se alguem ja leu ou ja viu o MEF saberia descrever aonde é utilzado de fato?

    Vlw pessoal

     



    Ozzyvegeta
    quarta-feira, 21 de julho de 2010 22:28

Respostas

  • Quis dizer que o MEF trabalha orientado a componentes.

    1- Injeção de dependencia seria um tipo (em varios) de Inversão de controle??

    Sim.


    Lew Segadilha Analista Desenvolvedor .Net
    • Marcado como Resposta Ozzyvegeta sexta-feira, 27 de agosto de 2010 11:21
    segunda-feira, 23 de agosto de 2010 14:05
  • Não.. Na verdade injeção de dependência NÃO É UM TIPO de inversão de controle.

    Tanto que voce pode ter INJEÇÃO DE DEPENDENCIA sem inversao de controle.

    Exemplo:

    public class ClasseA
    {
        private ClasseB _objB;
    
        public ClasseA(ClasseB obj)
        {
            _objB = obj;
        }
    }
    

    No exemplo acima, o objeto da classe B é injetado via construtor na classe A, porém ele continua sendo uma classe CONCRETA. Ou seja, INJEÇÃO DE DEPENDÊNCIA SEM INVERSÃO DE CONTROLE (OU INVERSÃO DE DEPENDÊNCIA).

    Se, ao inves de ClasseB, o construtor recebesse uma INTERFACE (que ClasseB implementa), aí sim estaríamos INVERTENDO CONTROLE (ou seja dependendo de uma abstração e não de uma classe concreta) utilizando INJEÇÃO DE DEPENDENCIA via construtor.

    Espero ter conseguido ser claro.

    Qualquer coisa, estamos aí.

    []s

     

     

     

     

     


    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications
    MCP Virtual Card: https://www.mcpvirtualbusinesscard.com/VBCServer/robsoncastilho/profile
    [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta Ozzyvegeta sexta-feira, 27 de agosto de 2010 11:21
    sexta-feira, 27 de agosto de 2010 03:51

Todas as Respostas

  • Olá,

    Veja no site do Martin fowler,

    http://martinfowler.com/articles/injection.html

     

    sexta-feira, 23 de julho de 2010 11:44
  • veja se estou certo... 

    - Inversão de controle é uma forma de terceirar determinada funcionalidade, como Logger.

    - Injeção de dependencia seria uma forma de inversão de controle, onde essa forma seria sem utilizar nenhum framework, seria isso?

    abs


    Ozzyvegeta
    sexta-feira, 23 de julho de 2010 13:39
  • Ozzy,

    Até onde entendo, os dois termos descrevem a mesma coisa. O primeiro termo foi "IoC" (inversion of control), como ficou um termo difícil de entender o ponto de vista de quem é o controle, cunhou-se o termo injeção de dependência (Dependency injection ou DI).

    Dá uma olhada nisso que te ajuda a entender a idéia. Está em Spring.Net, mas aplica-se a outras frameworks também:

    http://ericlemes.com/2009/03/12/dotnet-spring-pt1/

     

    Abraço,

    Eric

    sexta-feira, 6 de agosto de 2010 12:22
  • Inversão de controle - é a forma de se inverter a responsabilidade de uma classe sobre a outra, ou seja desacoplar uma da outra

    Ex:

    public
     class
     Pessoa
    {
     void
     Pessoa()
     {
     Carro c = new Carro(); }
    }

     

    Na inversão de controle você tiraria a responsabilidade de instânciar a classe Carro da classe pessoa e ficaria dessa forma:

     

    public
     class
     Pessoa
    {
    void Pessoa()
    {
     Carro c = Carro.Instanciar();
    }
    }

    Injeção de dependência - Forma de inverter o controle, porém utilizando uma dependencia em comum como "acoplamento" entre entidades

    Ex:

    public
     class
     Pessoa
    {

    void Pessoa(Vectra carro)
     {
     carro.Acelerar();
     }
    }

    Ao invés de receber um carro você poderia usar uma interface para intermediar essa dependencia:

    public
     class
     Pessoa
    {
     void Pessoa(IAutomovel carro)
     {
     carro.Acelerar();
     }
    }

    Assim você não sabe que automóvel vai receber so sabe que ele deve implementar a interface IAutomovel e assim poder executar o método Acelerar(), independente de qual carro seja Vectra, Corsa.......

    Espero ter ajudado,

    Att,

    Lew Segadilha

    • Sugerido como Resposta Danimar Ribeiro terça-feira, 10 de agosto de 2010 10:27
    sexta-feira, 6 de agosto de 2010 17:23
  • Vamos lah, oq vc quis dizer é q inversão de controle seria delegar a um metodo ou classe a criação de outra classe e injeção de dependencia seria usar o conceito de interfaces a grosso modo?

     

     

     

     


    Ozzyvegeta
    segunda-feira, 16 de agosto de 2010 01:28
  • A grosso modo sim, pois este foi apenas um exemplo de você reproduzir algo conteitual que são esses dois padrões em código , pois a inversão de controle nada mais é do que um padrão de desacoplamento, ou seja, de inversão de responsabilidades , no exemplo que citei eu tirei a responsabilidade da classe pessoa de instanciar o carro e passei essa responsabiliade para a própria classe de carro, então a classe pessoa nao se preocupa mais em saber como se deve instanciar um carro, apenas consome o objeto, resumindo ela não depende mais da construção da classe carro para digamos Compilar , apenas do método instanciar.

    Já no caso da Injeção de dependência , como você disse uma das fomas é você programar para uma interface , pois nesse caso você mais uma vez inverte a responsabilidade de criação do objeto e ainda mais inverte a responsabilidade de COMPORTAMENTO  DO MÉTODO uma vez que qualquer classe que implemente aquela interface pode ter um comportamento próprio para suas implementações.

     

    Espero ter ajudado,

     


    Lew Segadilha Analista Desenvolvedor .Net
    segunda-feira, 16 de agosto de 2010 12:59
  • bom, estou quase entendendo... bom, dizer que inversão de controle é uma tecnica de instanciar uma classe estaria certo então? Outra tecnica de Inversão de controle poderia ser o Factory por exemplo? ou o Factory seria outro pattern que não tem nada haver com essa historia? E qual seria outro metodo de injeção de dependência? o MEF, novo framework da microsoft, poderia ser um exemplo de injeção de dependencia? 

    []s

     


    Ozzyvegeta
    segunda-feira, 16 de agosto de 2010 22:24
  • bom, estou quase entendendo... bom, dizer que inversão de controle é uma tecnica de instanciar uma classe estaria certo então?

    Não, o que eu fiz através de instancias foi uma forma de baixar o acoplamento entre as classes utilizando o padrão/Conceito de inversão de controle. Resumindo o que ocorre na inversão de controle é o seguinte. Você tem uma classe A que é instanciada dentro da classe B, logo a classe B depende da classe A para existir uma vez que o construtor da classe A adquire um parâmetro, por qualquer motivo, a classe B precisa ser alterada. Falo isso em um nível mínimo de abstração, imagine um sistema imenso que possui varias classes chamando a mesma? seria uma manutenção muito complicada, logo se você de alguma forma inverte o controle do objeto, a classe que dependia desse controle apenas consome um recurso do mesmo que é de se instanciar.

    Outra tecnica de Inversão de controle poderia ser o Factory por exemplo?

    Você pode claramente aplicar conceitos de inversão de controle associados ao factory uma vez que esse padrão se utiliza de interfaces para execução de métodos.

    E qual seria outro metodo de injeção de dependência?

    Você pode utilizar classes abstratas, Classes base, Camadas de negócio, isso varia muito do comportamento que você espera de um objeto, da sua arquitetura, do seu cliente, de um a série de fatores que um arquiteto deve observar antes de se definir a arquitetura de um sistema.

    o MEF, novo framework da microsoft, poderia ser um exemplo de injeção de dependencia?

    Não sou o mais indicado para falar do MEF, mas pelo que eu já li a respeito, Sim. Pois o MEF trabalha com Composição, e ao invés de você programar para uma Implementação você programa para uma Abstração ou seja Injeção de dependência.


    Lew Segadilha Analista Desenvolvedor .Net
    terça-feira, 17 de agosto de 2010 12:38
  • 1- Injeção de dependencia seria um tipo (em varios) de Inversão de controle??

    2-vc disse "Pois o MEF trabalha com Composição" Composição seria outro pattern?

    abs


    Ozzyvegeta
    terça-feira, 17 de agosto de 2010 14:54
  • Não estou falando de composite, e sim de componentes o MEF visa programar com desacoplamento, por componentes, ou seja tipo "pugins"

    Lew Segadilha Analista Desenvolvedor .Net
    terça-feira, 17 de agosto de 2010 17:41
  • Basicamente a pergunta foi oq vc quis dizer com "Pois o MEF trabalha com Composição"? 

    1- Injeção de dependencia seria um tipo (em varios) de Inversão de controle??




    Ozzyvegeta
    terça-feira, 17 de agosto de 2010 22:43
  • Quis dizer que o MEF trabalha orientado a componentes.

    1- Injeção de dependencia seria um tipo (em varios) de Inversão de controle??

    Sim.


    Lew Segadilha Analista Desenvolvedor .Net
    • Marcado como Resposta Ozzyvegeta sexta-feira, 27 de agosto de 2010 11:21
    segunda-feira, 23 de agosto de 2010 14:05
  • Não.. Na verdade injeção de dependência NÃO É UM TIPO de inversão de controle.

    Tanto que voce pode ter INJEÇÃO DE DEPENDENCIA sem inversao de controle.

    Exemplo:

    public class ClasseA
    {
        private ClasseB _objB;
    
        public ClasseA(ClasseB obj)
        {
            _objB = obj;
        }
    }
    

    No exemplo acima, o objeto da classe B é injetado via construtor na classe A, porém ele continua sendo uma classe CONCRETA. Ou seja, INJEÇÃO DE DEPENDÊNCIA SEM INVERSÃO DE CONTROLE (OU INVERSÃO DE DEPENDÊNCIA).

    Se, ao inves de ClasseB, o construtor recebesse uma INTERFACE (que ClasseB implementa), aí sim estaríamos INVERTENDO CONTROLE (ou seja dependendo de uma abstração e não de uma classe concreta) utilizando INJEÇÃO DE DEPENDENCIA via construtor.

    Espero ter conseguido ser claro.

    Qualquer coisa, estamos aí.

    []s

     

     

     

     

     


    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications
    MCP Virtual Card: https://www.mcpvirtualbusinesscard.com/VBCServer/robsoncastilho/profile
    [Se o post foi útil, não esqueça de marcá-lo. Obrigado]
    • Marcado como Resposta Ozzyvegeta sexta-feira, 27 de agosto de 2010 11:21
    sexta-feira, 27 de agosto de 2010 03:51
  • foram bem claros sim.. obrigado e abraços a todos!
    Ozzyvegeta
    sexta-feira, 27 de agosto de 2010 11:21
  • Não.. Na verdade injeção de dependência NÃO É UM TIPO de inversão de controle.

    Tanto que voce pode ter INJEÇÃO DE DEPENDENCIA sem inversao de controle.

    Exemplo:

     

    public
     class
     ClasseA
    {
      private
     ClasseB _objB;
    
      public
     ClasseA(ClasseB obj)
      {
        _objB = obj;
      }
    }
    

     

    No exemplo acima, o objeto da classe B é injetado via construtor na classe A, porém ele continua sendo uma classe CONCRETA. Ou seja, INJEÇÃO DE DEPENDÊNCIA SEM INVERSÃO DE CONTROLE (OU INVERSÃO DE DEPENDÊNCIA).

    Se, ao inves de ClasseB, o construtor recebesse uma INTERFACE (que ClasseB implementa), aí sim estaríamos INVERTENDO CONTROLE (ou seja dependendo de uma abstração e não de uma classe concreta) utilizando INJEÇÃO DE DEPENDENCIA via construtor.

    Espero ter conseguido ser claro.

    Qualquer coisa, estamos aí.

    []s

     

     

     

     

     


    Robson Castilho - MCTS .Net 2.0 Windows/Web Applications
    MCP Virtual Card: https://www.mcpvirtualbusinesscard.com/VBCServer/robsoncastilho/profile
    [Se o post foi útil, não esqueça de marcá-lo. Obrigado]

    Inversão de controle é um principio de OO que significa que uma classe não deve controlar as suas dependências. Ou seja, sim, IoC engloba Injeção de Dependência.
    quinta-feira, 23 de setembro de 2010 20:40
  • Ótima explicação Robson!!!
    sexta-feira, 21 de agosto de 2015 18:33