Primeiro, sou programador iniciante; Na verdade, estou terminando o curso AS com um projeto final no verão. No meu novo trabalho, quando não há um projeto para mim (eles estão esperando para preencher a equipe com mais contratações), recebi livros para ler e aprender enquanto espero - alguns livros didáticos, outros nem tanto (como o Code Complete). Depois de ler esses livros, voltei-me à Internet para aprender o máximo possível e comecei a aprender sobre o SOLID e o DI (falamos um pouco sobre o princípio de substituição de Liskov, mas não muitas outras idéias sobre o SOLID). Então, como aprendi, sentei-me para aprender melhor e comecei a escrever algum código para utilizar o DI manualmente (não há estruturas de DI nos computadores de desenvolvimento).
A coisa é que, ao fazê-lo, percebo que parece familiar ... e parece que é muito parecido com o trabalho que fiz no passado usando composição de classes abstratas usando polimorfismo. Estou perdendo uma imagem maior aqui? Existe algo sobre DI (pelo menos à mão) que vai além disso? Eu entendo a possibilidade de ter configurações que não estão no código de algumas estruturas de DI, com grandes benefícios no que diz respeito a mudar as coisas sem precisar recompilar, mas ao fazer isso manualmente, não tenho certeza se é diferente do indicado acima ... Algumas dicas sobre isso seriam muito úteis!
fonte
O melhor artigo que eu já li sobre o assunto foi o de James Shore . Eu venho fazendo " DI à mão " há séculos, como parte da abstração e polimorfismo. Então, depois que entrei no mundo profissional e continuei ouvindo esse termo, tive uma grande desconexão entre o que achava que a palavra deveria significar e o que realmente significa:
Isso é do post de Shore, que esclareceu tudo para mim. Por exemplo:
Dado
Em vez de escrever:
Você escreve algo assim:
E isso evita que a
Car
instância precise lidar comEngine
detalhes específicos . Um carro só precisa de um motor, ele não se importa com o que implementa a funcionalidade básica do motor. Ou seja, suaCar
classe não está vinculada a dependência de implementação específica; é "injetado" em outro lugar, potencialmente em tempo de execução.Este exemplo específico de carro usa o subtipo de DI chamado "Injeção de construtor", o que significa apenas que a dependência foi entregue como um argumento de construtor. Você também pode usar um
setEngine(Engine a)
método para "Injeção de setter" e assim por diante, mas esses subtipos me parecem pedantes.Um pouco mais longe, no entanto, muitas estruturas de DI fornecem o clichê para conectar um monte dessas coisas com referências mais abstratas.
É isso aí.
fonte
Não sou especialista, pois só comecei a usar DI nos últimos dois anos, mas alguns dos temas / funcionalidades úteis dos contêineres de DI que notei são (os quais não considero produtos de composição / polimorfismo (mas posso ser corrigido nisso):
fonte
Além do DI, há uma configuração de composição de classe no aplicativo raiz (em vez de configurar usando xml). Não há necessidade de nenhuma estrutura de DI ou IoC, mesmo que elas possam arrumar a configuração da composição de classe, principalmente para grandes projetos. Isso ocorre porque a estrutura DI normalmente vem com um contêiner que implementa recursos adicionais, como a fiação automática, que ajuda a configurar a composição da classe. Você pode ler a entrada do meu blog para extrair meu entendimento sobre este tópico.
fonte