DNAD 2009 - Injeção de Dependência (por Leandro Daniel)
-
Upload
leandro-daniel -
Category
Technology
-
view
2.394 -
download
4
description
Transcript of DNAD 2009 - Injeção de Dependência (por Leandro Daniel)
Injeção de Dependência
Leandro DanielMCAD, MCSD, CSM
Utilizando injeção de dependência com o Unity
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
Contexto de utilização
DI
Class3
Class2
Class1
Era uma vez...
No início...
Dev1
Dev2
Dev3
!
Contornando...
Dev1
Dev2
Dev3
Tester
Method Stub ConsoleLogger
?
Classe pronta...
Dev1
Dev2
Dev3
Method Stub ConsoleLogger
!
Mudanças acontecem...
Dev1
Dev2
Dev3
Tester
!!
??
Mudanças acontecem, sempre...
Dev1
Dev2
Dev3
Tester
!!!
???
@#$!
...
Um provável cenário...
Dev1
Dev2
Dev3
Alto acoplamento!
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)
Lembre-se
coesão ≠ acoplamento
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
O padrão de Injeção de Dependência
Design Patterns podem ajudar...
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 é?
SL e DI (IoC)
Origem
Martin Fowler, popularizou o termo Injeção de Dependência como uma forma de Inversão de Controle
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.”
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...
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?
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...
E o arquiteto?
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
Unity Application Block
Cross-cutting concerns e algo mais...
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
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
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
Constructor Injection
Setter Injection
Unity Application BlockSimples
Extensível
Código-fonte disponível
AOP
Unity Application Block
Cuidado com areferência circular!
Métricas de acoplamento
Como medir as dependências?
Fonte: http://tinyurl.com/couplingmetrics (CodeBetter - artigo de Patrick Smacchia, MVP C#)
Exemplo:Códigomorto
Exemplo:Problemasde design
Quanta dependência mesmo?
Demonstração
Downloads
Unity Application Blockhttp://www.codeplex.com/unity
Enterprise Library http://www.codeplex.com/entlib
NDependhttp://www.ndepend.com/
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
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
Dúvidas
Obrigado!
Até o DNAD 2010!Leandro Daniel
[email protected]://reverb.leandrodaniel.com
Twitter: @leandronet