42
Injeção de Dependência Leandro Daniel MCAD, MCSD, CSM Utilizando injeção de dependência com o Unity

DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Embed Size (px)

DESCRIPTION

Palestra de Leandro Daniel no .Net Architects Day 2009 sobre injeção de dependência com o Unity.

Citation preview

Page 1: 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

Page 2: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

Contexto de utilização

DI

Class3

Class2

Class1

Page 4: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Era uma vez...

Page 5: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

No início...

Dev1

Dev2

Dev3

!

Page 6: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Contornando...

Dev1

Dev2

Dev3

Tester

Method Stub ConsoleLogger

?

Page 7: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Classe pronta...

Dev1

Dev2

Dev3

Method Stub ConsoleLogger

!

Page 8: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Mudanças acontecem...

Dev1

Dev2

Dev3

Tester

!!

??

Page 9: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Mudanças acontecem, sempre...

Dev1

Dev2

Dev3

Tester

!!!

???

@#$!

...

Page 10: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Um provável cenário...

Dev1

Dev2

Dev3

Alto acoplamento!

Page 11: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

Lembre-se

coesão ≠ acoplamento

Page 13: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

O padrão de Injeção de Dependência

Page 15: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Design Patterns podem ajudar...

Page 16: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

SL e DI (IoC)

Page 18: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

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)

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)

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)

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)

E o arquiteto?

Page 24: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

Unity Application Block

Page 26: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Cross-cutting concerns e algo mais...

Page 27: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

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)

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)

Constructor Injection

Page 31: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Setter Injection

Page 32: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Unity Application BlockSimples

Extensível

Código-fonte disponível

AOP

Page 33: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Unity Application Block

Cuidado com areferência circular!

Page 34: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Métricas de acoplamento

Page 35: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

Quanta dependência mesmo?

Page 37: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Demonstração

Page 38: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

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)

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)

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)

Dúvidas

Page 42: DNAD 2009 - Injeção de Dependência (por Leandro Daniel)

Obrigado!

Até o DNAD 2010!Leandro Daniel

[email protected]://reverb.leandrodaniel.com

Twitter: @leandronet