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

Preview:

DESCRIPTION

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

Citation preview

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

contato@leandrodaniel.comhttp://reverb.leandrodaniel.com

Twitter: @leandronet

Recommended