Eu estive analisando os termos injeção de construtor e injeção de dependência enquanto examinava artigos sobre padrões de design (localizador de serviços).
Quando pesquisei no Google sobre injeção de construtores, obtive resultados pouco claros, o que me levou a fazer o check-in aqui.
O que é injeção de construtor? Esse é um tipo específico de injeção de dependência? Um exemplo canônico seria uma grande ajuda!
Editar
Revisitando essas perguntas depois de um intervalo de uma semana, posso ver como eu estava perdida ... Caso alguém mais apareça aqui, atualizarei o corpo da pergunta com um pouco de aprendizado meu. Por favor, sinta-se livre para comentar / corrigir. Injeção de construtor e injeção de propriedade são dois tipos de injeção de dependência.
fonte
Respostas:
Não sou especialista, mas acho que posso ajudar. E sim, é um tipo específico de injeção de dependência.
Isenção de responsabilidade: quase tudo isso foi "roubado" do Ninject Wiki
Vamos examinar a idéia de injeção de dependência, percorrendo um exemplo simples. Digamos que você esteja escrevendo o próximo jogo de grande sucesso, onde nobres guerreiros lutam por grande glória. Primeiro, precisaremos de uma arma adequada para armar nossos guerreiros.
Então, vamos criar uma classe para representar nossos próprios guerreiros. Para atacar seus inimigos, o guerreiro precisará de um método Attack (). Quando esse método é chamado, ele deve usar sua espada para golpear seu oponente.
Agora, podemos criar nosso Samurai e lutar!
Como você pode imaginar, isso imprimirá Chopped the evildoers limpo ao meio no console. Isso funciona muito bem, mas e se quiséssemos armar nosso Samurai com outra arma? Como o Sword é criado dentro do construtor da classe Samurai, precisamos modificar a implementação da classe para fazer essa alteração.
Quando uma classe depende de uma dependência concreta, diz-se que ela está fortemente acoplada a essa classe . Neste exemplo, a classe Samurai está fortemente acoplada à classe Sword. Quando as classes são fortemente acopladas, elas não podem ser trocadas sem alterar sua implementação. Para evitar o acoplamento de classes, podemos usar interfaces para fornecer um nível de indireção. Vamos criar uma interface para representar uma arma em nosso jogo.
Então, nossa classe Sword pode implementar esta interface:
E podemos alterar nossa classe Samurai:
Agora nosso Samurai pode estar armado com armas diferentes. Mas espere! A espada ainda é criada dentro do construtor do Samurai. Como ainda precisamos alterar a implementação do Samurai para dar ao nosso guerreiro outra arma, o Samurai ainda está fortemente acoplado ao Sword.
Felizmente, existe uma solução fácil. Em vez de criar a espada de dentro do construtor de Samurai, podemos expô-la como um parâmetro do construtor. Também conhecida como Injeção de Construtor.
Como Giorgio apontou, também há injeção de propriedade. Isso seria algo como:
Espero que isto ajude.
fonte
Vou tentar o máximo possível para tornar isso muito elementar. Dessa forma, você pode desenvolver o conceito e criar suas próprias soluções ou idéias complexas.
Agora imagine que temos uma igreja chamada Jubileu, que tem filiais em todo o mundo. Nosso objetivo é simplesmente obter um item de cada filial. Aqui estaria a solução com o DI;
1) Crie uma interface IJubilee:
2) Crie uma classe JubileeDI que levaria a interface IJubilee como construtor e retornaria um item:
3) Agora crie três braches do Jubileu, a saber, JubileeGT, JubileeHOG, JubileeCOV, que todos DEVEM herdar a interface do IJubilee. Por diversão, faça com que um deles implemente seu método como virtual:
4) É isso aí! Agora vamos ver o DI em ação:
Para cada instância da classe de contêiner, passamos uma nova instância da classe que exigimos, o que permite um acoplamento flexível.
Espero que isso explique o conceito em poucas palavras.
fonte
Suponha que você tenha uma classe em
A
cada instância, que precisa de uma instância de outra classeB
.Injeção de dependência significa que a referência a
B
é definida pelo objeto que gerencia a instânciaA
(em vez de ter a classeA
gerenciando a referênciaB
diretamente).Injeção de construtor significa que a referência a
B
é passada como um parâmetro para o construtorA
e definido no construtor:Uma alternativa é usar um método setter (ou uma propriedade) para definir a referência
B
. Neste caso, o objeto que gerencia uma instânciaa
deA
deve primeiro chamar o construtorA
e depois chamar o método setter para definir a variável de membroA.b
antesa
é usado. O método de injecção último é necessário quando os objectos conter referências cíclicas para o outro, por exemplo, se um exemplob
deB
que é definido em um exemploa
deA
contem uma referência de volta paraa
.** EDIT **
Aqui estão mais alguns detalhes para abordar o comentário.
1. A classe A gerencia a instância B
2. A instância B é definida no construtor
3. Instância B é configurada usando o método setter
fonte
itemA
ouobjectA
apenas para aumentar o nome nem sempre é melhor.