dnad 2009 - injeção de dependência (por leandro daniel)
DESCRIPTION
Palestra de Leandro Daniel no .Net Architects Day 2009 sobre injeção de dependência com o Unity.TRANSCRIPT
![Page 1: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/1.jpg)
Injeção de Dependência
Leandro DanielMCAD, MCSD, CSM
Utilizando injeção de dependência com o Unity
![Page 2: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/2.jpg)
AgendaContexto de utilização
O padrão de injeção de dependência
Apresentando o Unity Application Block
Entendendo métricas de acoplamento
Demonstração
Dúvidas
![Page 3: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/3.jpg)
Contexto de utilização
DI
Class3
Class2
Class1
![Page 4: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/4.jpg)
Era uma vez...
![Page 5: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/5.jpg)
No início...
Dev1
Dev2
Dev3
!
![Page 6: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/6.jpg)
Contornando...
Dev1
Dev2
Dev3
Tester
Method Stub ConsoleLogger
?
![Page 7: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/7.jpg)
Classe pronta...
Dev1
Dev2
Dev3
Method Stub ConsoleLogger
!
![Page 8: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/8.jpg)
Mudanças acontecem...
Dev1
Dev2
Dev3
Tester
!!
??
![Page 9: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/9.jpg)
Mudanças acontecem, sempre...
Dev1
Dev2
Dev3
Tester
!!!
???
@#$!
...
![Page 10: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/10.jpg)
Um provável cenário...
Dev1
Dev2
Dev3
Alto acoplamento!
![Page 11: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/11.jpg)
ResumindoClasses com alto acoplamento dificultam a
manutenção e testabilidade (podem dificultar o desenvolvimento)
Alterações em classes com acoplamento aferente impactam as classes dependentes (e vice-versa)
Dependências complexas são difíceis de gerenciar
Deixar a aplicação plugável e flexível em geral requer prática (ou um framework)
![Page 12: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/12.jpg)
Lembre-se
coesão ≠ acoplamento
![Page 13: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/13.jpg)
Algumas técnicas disponíveisAbstract Factory PatternBuilder PatternService Locator PatternIoC - Inversion of Control Pattern
DI - Dependency Injection Pattern
Programe para uma interface e não para uma
implementação
![Page 14: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/14.jpg)
O padrão de Injeção de Dependência
![Page 15: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/15.jpg)
Design Patterns podem ajudar...
![Page 16: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/16.jpg)
Uma técnica para desacoplamento de classes (um caso particular de IoC)
Baseado em um builder responsável pela construção de outros objetos
Comumente, apresenta-se sob as três formas:◦Interface Injection ◦Setter injection ◦Constructor injection
Utiliza um container para armazenamento de objetos
O que é?
![Page 17: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/17.jpg)
SL e DI (IoC)
![Page 18: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/18.jpg)
Origem
Martin Fowler, popularizou o termo Injeção de Dependência como uma forma de Inversão de Controle
![Page 19: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/19.jpg)
Fonte: http://tinyurl.com/diinfoq(InfoQ- notícias, Craig Wickesser)
“Padronizar um conjunto de notações consistentes e não controverso que permita que classes injetáveis possam ser portadas
entre os vários frameworks.”
![Page 20: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/20.jpg)
Pico Container http://www.picocontainer.org
Spring Frameworks (Spring.NET) http://www.springframework.org
Guicehttp://code.google.com/p/google-guice
Castle Windsor (MicroKernel)http://www.castleproject.org
Alguns frameworks...
![Page 21: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/21.jpg)
Meus objetos e classes possuem dependência de outros objetos?
Minhas dependências são complexas e requerem abstração?
Injetar dependência na construção ou na chamada de objetos traz alguma vantagem?
Preciso gerenciar o tempo de vida dos meus objetos?
Preciso configurar as dependências dos meus objetos por meio de um arquivo de configuração?
Preciso manter um cache das minhas dependências numa aplicação Web?
Quando devo utilizar?
![Page 22: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/22.jpg)
As dependências forem muito simples
Faltam boas práticas básicas
As interfaces não podem ser definidas com clareza
Não existe ganho na utilização de containers
Repense a utilização se...
O ideal não existe...
![Page 23: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/23.jpg)
E o arquiteto?
![Page 24: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/24.jpg)
A aplicação de DI pode representar um risco levando em consideração o skill da equipe?
A empresa tem como cultura a prática de testes (TDD ou qualquer outra técnica)?
Se a aplicação não tem previsão de vida longa vale a pena aplicar DI?
‘
Eu consigo aumentar o skill da minha equipe aplicando nova técnica?
Eu consigo mostrar os benefícios de praticarmos TDD já que DI nos propicia isso mais facilmente?
Eu consigo comprovar que os custos com manutenção serão menores se empregarmos melhores técnicas agora, ainda que isso onere um pouco mais o projeto?
Tomando decisões
![Page 25: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/25.jpg)
Unity Application Block
![Page 26: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/26.jpg)
Cross-cutting concerns e algo mais...
![Page 27: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/27.jpg)
Unity Application Block
Fev/2008
• Lançado o CTP do Unity• http://www.codeplex.com/unity
Abr/2008 • Lançada a versão 1.0
Mai/2008
• Unity é incorporado a Enterprise Library 4.0• Continua com a opção de instalação separada
Out/2008
• Atualizada juntamente com a Enterprise Library 4.1• Versão separada atualizada para 1.2
Dez/2008• Port do Unity para Silverlight
Chris Tavares
![Page 28: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/28.jpg)
Unity Application BlockPossibilita construir instâncias de objetos
contendo dependência entre eles
Expõe um método chamado RegisterType que suporta a configuração do container com o mapeamento dos objetos (interface classe concreta)
Expõe o método Resolve que retorna as instâncias dos métodos construídos com todas as suas dependências resolvidas
![Page 29: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/29.jpg)
Unity Application Block
Provê injeção de dependência para interfaces e construtores de classes por meio de atributos nas propriedades e métodos
Hierarquia de containers
Configuração em arquivos XML
Lifetime Manager
![Page 30: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/30.jpg)
Constructor Injection
![Page 31: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/31.jpg)
Setter Injection
![Page 32: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/32.jpg)
Unity Application BlockSimples
Extensível
Código-fonte disponível
AOP
![Page 33: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/33.jpg)
Unity Application Block
Cuidado com areferência circular!
![Page 34: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/34.jpg)
Métricas de acoplamento
![Page 35: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/35.jpg)
Como medir as dependências?
Fonte: http://tinyurl.com/couplingmetrics (CodeBetter - artigo de Patrick Smacchia, MVP C#)
Exemplo:Códigomorto
Exemplo:Problemasde design
![Page 36: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/36.jpg)
Quanta dependência mesmo?
![Page 37: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/37.jpg)
Demonstração
![Page 38: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/38.jpg)
Downloads
Unity Application Blockhttp://www.codeplex.com/unity
Enterprise Library http://www.codeplex.com/entlib
NDependhttp://www.ndepend.com/
![Page 39: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/39.jpg)
Referências
IoC Containers and the Dependency Injection pattern(Martin Fowler, 2004)http://www.martinfowler.com/articles/injection.html
Enterprise Library Contribhttp://entlibcontrib.codeplex.com/
Exemplos complementareshttp://reverb.leandrodaniel.com/category/Enterprise-Library.aspx
Artigo na revista .net Magazine 62
![Page 40: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/40.jpg)
Referências
Designing Reusable Classes (Ralph Johnson & Brian Foote, 1988)http://www.laputan.org/drc/drc.html
Inversion of Control(Martin Fowler, 2005)http://martinfowler.com/bliki/InversionOfControl.html
javax.inject.Inject(Google Code)http://tinyurl.com/ceaknx
![Page 41: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/41.jpg)
Dúvidas
![Page 42: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)](https://reader033.vdocuments.pub/reader033/viewer/2022061120/546cf8b5af795962298b51db/html5/thumbnails/42.jpg)
Obrigado!
Até o DNAD 2010!Leandro Daniel
[email protected]://reverb.leandrodaniel.com
Twitter: @leandronet