SlideShare ist ein Scribd-Unternehmen logo
1 von 51
Fazendo injeção de dependência com Unity 1.2 Giovanni Bassi [email_address] http://unplugged.giggio.net Arquiteto de software independente
 
Online @ Giovanni Bassi Email :   [email_address] Blog técnico:  unplugged.giggio.net  Site:  giovannibassi.com  Twitter:  @giovannibassi .Net Architects Grupo:  www.dotnetarchitects.net  Podcast:  podcast.dotnetarchitects.net  Online:  tinyurl.com/DotNetArch  Twitter:  #DotNetArchitects
Agenda
Inversão de dependência
Tudo começou... ,[object Object],[object Object],“
Inversão de dependência ,[object Object],[object Object],[object Object],[object Object],[object Object]
Inversão de dependência Serviço Interface gráfica
Inversão de dependência Abstração serviço Serviço Interface gráfica
Inversão de dependência Serviço Acesso a dados Utilidades Interface gráfica
Inversão de dependência Abstração serviço Abstração de acesso a dados Abstração de utilidades Serviço Acesso a dados Utilidades Interface gráfica
Recursos úteis Robert C. Martin (Uncle Bob) : Solid:  butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod  DI:  objectmentor.com/resources/articles/dip.pdf Martin Fowler:  martinfowler.com/bliki/InversionOfControl.html  e  http://martinfowler.com/articles/injection.html Wikipedia:  en.wikipedia.org/wiki/Inversion_of_control
 
Injeção de dependência ,[object Object],[object Object],[object Object],[object Object],[object Object]
Sem injeção public   class   RepositorioPost { private   GerenciadorConexaoBD  _gerenciador;   public  RepositorioPost() { _gerenciador = new  GerenciadorConexaoBD (); } }
Com Injeção public   class   RepositorioPost { private   GerenciadorConexaoBD  _gerenciador;   public  RepositorioPost( GerenciadorConexaoBD  gerenciador) { _gerenciador =  gerenciador ; } }
Injeção pobre public   class   RepositorioPost { private   IGerenciadorConexaoBD  _gerenciador;   public  RepositorioPost()  : this(new  GerenciadorConexaoBD ())   {} public  RepositorioPost( IGerenciadorConexaoBD  gerenciador) { _gerenciador = gerenciador; } }
Flexibilidade de trocar  a implementação Simplificação Desacoplamento Testes facilitados
Complexidade Meio “mágico” Precisa configurar
O Unity
Unity ,[object Object],[object Object]
Unity ,[object Object],[object Object],[object Object],[object Object]
Tipos de injeção de dependência
Tipos de DI ,[object Object],[object Object],[object Object],[object Object]
Cenário
Constructor Injection public   class   RepositorioPost { public  RepositorioPost( IGerenciadorConexaoBD  gerenciador) { _gerenciador =  gerenciador ; } } Classe com dependência:
Constructor Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
Property Injection public   class   RepositorioPost   { [ Dependency ] public   IGerenciadorConexaoBD  Gerenciador  {  get ;  set ; } } Classe com dependência:
Propery Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
Method call Injection public   class   RepositorioPost { private   IGerenciadorConexaoBD  _gerenciador; [ InjectionMethod ] public   void  Configurar( IGerenciadorConexaoBD  gerenciador) { _gerenciador = gerenciador; } } Classe com dependência:
Method call Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
Use constructor injection
Injetando em objetos não  construídos pelo contêiner
Pós construção public   class   RepositorioPost { private   IGerenciadorConexaoBD  _gerenciador;   [ InjectionMethod ] public   void  Configurar( IGerenciadorConexaoBD  gerenciador) { _gerenciador = gerenciador; } } Classe com dependência:
Pós construção Resolvendo: _repositorio =  new   RepositorioPost (); conteiner.BuildUp(_repositorio);
 
Configurando var  c =  new   UnityContainer (); c.RegisterType < IRepositorioPost ,  RepositorioPost >(); c.RegisterType < IGerenciadorConexaoBD ,  GerenciadorConexaoBD >(); Programaticamente:
Configurando < section   name = &quot; unity &quot; type = &quot; Microsoft.Practices.Unity.Configuration .UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0,  Culture=neutral,  PublicKeyToken=31bf3856ad364e35 &quot;  /> Com configuração:
Configurando < unity > < containers > < container   name = &quot; container &quot; > < types > < type   type = &quot; BlogWeb.Models.IRepositorioPost,  BlogWeb &quot;   mapTo = &quot; BlogWeb.Models.RepositorioPost,  BlogWeb &quot;  /> </ types > </ container > </ containers > </ unity > Com configuração:
Roadmap
 
Testes ,[object Object],[object Object],[object Object]
Teste // Arrange const   string  titulo =  &quot;Um titulo&quot; ; var  repositorio =  new   Mock < IRepositorioPost >  ( MockBehavior .Strict); var  post =  new   Post { Id = 1, Corpo =  &quot;corpo&quot; , Titulo = titulo }; repositorio.Setup( r => r.ObterPost(titulo)).Returns(post); var  controller =  new   PostsController (repositorio.Object);
Teste // Act var  result = controller.Post(titulo)  as   ViewResult ;   // Assert Assert .IsNotNull(result); Assert .IsNotNull(result.ViewData.Model); Assert .AreEqual(post, result.ViewData.Model); repositorio.VerifyAll();
Demo Demo Incluindo DI em um projeto
Links e recursos úteis
Recursos úteis Unity no Codeplex:  unity.codeplex.com Unity no MSDN :   msdn.microsoft.com/unity EntLib no Codeplex:  entlib.codeplex.com EntLib no MSDN:  msdn.microsoft.com/entlib Hands On Labs:  tinyurl.com/unity12hol Blog do Leandro Daniel:  reverb.leandrodaniel.com Artigo do Leandro Daniel  na .Net Magazine (edição 62):
[object Object],[object Object],[object Object],[object Object],[object Object]
Perguntas?
Obrigado Giovanni Bassi [email_address] blog: http://unplugged.giggio.net
Online @ Giovanni Bassi Email :   [email_address] Blog técnico:  unplugged.giggio.net  Site:  giovannibassi.com  Twitter:  @giovannibassi .Net Architects Grupo:  www.dotnetarchitects.net  Podcast:  podcast.dotnetarchitects.net  Online:  tinyurl.com/DotNetArch  Twitter:  #DotNetArchitects

Weitere ähnliche Inhalte

Was ist angesagt?

JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
elliando dias
 
AutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic AcademyAutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic Academy
Fausto Siqueira
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
elliando dias
 

Was ist angesagt? (20)

JUnit: framework de testes unitários
JUnit: framework de testes unitáriosJUnit: framework de testes unitários
JUnit: framework de testes unitários
 
Como fazer controle de versões de dados e modelos de Machine Learning usando...
 Como fazer controle de versões de dados e modelos de Machine Learning usando... Como fazer controle de versões de dados e modelos de Machine Learning usando...
Como fazer controle de versões de dados e modelos de Machine Learning usando...
 
Aplicando CDI em aplicações Java
Aplicando CDI em aplicações JavaAplicando CDI em aplicações Java
Aplicando CDI em aplicações Java
 
Artoolkit vs2005 v1.0
Artoolkit vs2005 v1.0Artoolkit vs2005 v1.0
Artoolkit vs2005 v1.0
 
TDD em 220V
TDD em 220VTDD em 220V
TDD em 220V
 
AutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic AcademyAutomaçãoWeb - Chaordic Academy
AutomaçãoWeb - Chaordic Academy
 
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
Programação assíncrona com C# 5 no Visual Studio 2013 [MVP ShowCast 2013 - DE...
 
Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2Gerenciando aspectos e eventos com Zend Framework 2
Gerenciando aspectos e eventos com Zend Framework 2
 
Introdução a testes unitários com jUnit
Introdução a testes unitários com jUnitIntrodução a testes unitários com jUnit
Introdução a testes unitários com jUnit
 
Trabalhando com eventos e serviços no Zend Framework 2
Trabalhando com eventos e serviços no Zend Framework 2Trabalhando com eventos e serviços no Zend Framework 2
Trabalhando com eventos e serviços no Zend Framework 2
 
Testes de Unidade com JUnit
Testes de Unidade com JUnitTestes de Unidade com JUnit
Testes de Unidade com JUnit
 
VRaptor4
VRaptor4VRaptor4
VRaptor4
 
Testes de Unidade com Junit
Testes de Unidade com JunitTestes de Unidade com Junit
Testes de Unidade com Junit
 
Dicas e Truques TypeScript
Dicas e Truques TypeScriptDicas e Truques TypeScript
Dicas e Truques TypeScript
 
better faster stronger dagger
better faster stronger daggerbetter faster stronger dagger
better faster stronger dagger
 
Junit
JunitJunit
Junit
 
Junit 4.0
Junit 4.0Junit 4.0
Junit 4.0
 
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
JSR 352 - Processamento Batch na Plataforma Java - JustJava 2013
 
Teste de Integracao com DbUnit e JStryker
Teste de Integracao com DbUnit e JStrykerTeste de Integracao com DbUnit e JStryker
Teste de Integracao com DbUnit e JStryker
 
Padrão Command
Padrão CommandPadrão Command
Padrão Command
 

Andere mochten auch

Community eindhoven 13dec2011
Community eindhoven 13dec2011Community eindhoven 13dec2011
Community eindhoven 13dec2011
Bart Brouwers
 
Smartphone & journalisten
Smartphone & journalistenSmartphone & journalisten
Smartphone & journalisten
Bart Brouwers
 
Jarrera eta Ikaskuntza Donostia 2011 1. gaia
Jarrera eta Ikaskuntza Donostia 2011 1. gaiaJarrera eta Ikaskuntza Donostia 2011 1. gaia
Jarrera eta Ikaskuntza Donostia 2011 1. gaia
KirolPsikologia
 
A Historia
A HistoriaA Historia
A Historia
curradbc
 
Fontys business model generation & dichtbij
Fontys business model generation & dichtbijFontys business model generation & dichtbij
Fontys business model generation & dichtbij
Bart Brouwers
 

Andere mochten auch (20)

PIG
PIGPIG
PIG
 
It Idea
It IdeaIt Idea
It Idea
 
10 Golden Rules, Hyperlocal
10 Golden Rules, Hyperlocal10 Golden Rules, Hyperlocal
10 Golden Rules, Hyperlocal
 
Community eindhoven 13dec2011
Community eindhoven 13dec2011Community eindhoven 13dec2011
Community eindhoven 13dec2011
 
Smartphone & journalisten
Smartphone & journalistenSmartphone & journalisten
Smartphone & journalisten
 
Zipmark product and market overview
Zipmark product and market overviewZipmark product and market overview
Zipmark product and market overview
 
We Care
We CareWe Care
We Care
 
Yeoman
YeomanYeoman
Yeoman
 
Smc040, new journalism requires new attitudes
Smc040, new journalism requires new attitudesSmc040, new journalism requires new attitudes
Smc040, new journalism requires new attitudes
 
Jarrera eta Ikaskuntza Donostia 2011 1. gaia
Jarrera eta Ikaskuntza Donostia 2011 1. gaiaJarrera eta Ikaskuntza Donostia 2011 1. gaia
Jarrera eta Ikaskuntza Donostia 2011 1. gaia
 
Dreamscape
DreamscapeDreamscape
Dreamscape
 
Amplifying Social Impact in a Connected Age
Amplifying Social Impact in a Connected AgeAmplifying Social Impact in a Connected Age
Amplifying Social Impact in a Connected Age
 
E52 expat top 10 2016
E52 expat top 10 2016E52 expat top 10 2016
E52 expat top 10 2016
 
A Historia
A HistoriaA Historia
A Historia
 
Fontys business model generation & dichtbij
Fontys business model generation & dichtbijFontys business model generation & dichtbij
Fontys business model generation & dichtbij
 
Term 3, Week 1, 2010
Term 3, Week 1, 2010Term 3, Week 1, 2010
Term 3, Week 1, 2010
 
Tiempo descarga en recipientes
Tiempo descarga en recipientesTiempo descarga en recipientes
Tiempo descarga en recipientes
 
6 kontekstual
6 kontekstual6 kontekstual
6 kontekstual
 
Novay 8 december 2011
Novay 8 december 2011Novay 8 december 2011
Novay 8 december 2011
 
RUN FOR HOPE
RUN FOR HOPERUN FOR HOPE
RUN FOR HOPE
 

Ähnlich wie Fazendo Injeção de dependência com Unity 1.2

Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCar
Luiz Ribeiro
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
elliando dias
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
elliando dias
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
Felipe Pimentel
 

Ähnlich wie Fazendo Injeção de dependência com Unity 1.2 (20)

Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012Dependency injection WTF? - PHPSC Conference 2012
Dependency injection WTF? - PHPSC Conference 2012
 
Domain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BHDomain Driven Design (DDD) - DevIsland, BH
Domain Driven Design (DDD) - DevIsland, BH
 
Testes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizadosTestes em aplicações JEE: Montando sua infra de testes automatizados
Testes em aplicações JEE: Montando sua infra de testes automatizados
 
CDI Extensions e DeltaSpike
CDI Extensions e DeltaSpikeCDI Extensions e DeltaSpike
CDI Extensions e DeltaSpike
 
Conhecendo o Spring
Conhecendo o SpringConhecendo o Spring
Conhecendo o Spring
 
iOS Delegates - Mobile Conf Rio 2014
iOS Delegates - Mobile Conf Rio 2014iOS Delegates - Mobile Conf Rio 2014
iOS Delegates - Mobile Conf Rio 2014
 
Dojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCarDojo de programação - Dia de Java - UFSCar
Dojo de programação - Dia de Java - UFSCar
 
Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007Apostilava Java EE 5 - 2007
Apostilava Java EE 5 - 2007
 
Construindo interfaces com XIBs reutilizáveis
Construindo interfaces com XIBs reutilizáveisConstruindo interfaces com XIBs reutilizáveis
Construindo interfaces com XIBs reutilizáveis
 
Spring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento webSpring + Tapestry Um novo paradigma de desenvolvimento web
Spring + Tapestry Um novo paradigma de desenvolvimento web
 
Minicurso Objective-C
Minicurso Objective-CMinicurso Objective-C
Minicurso Objective-C
 
Inversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET FrameworkInversão de Controlo e Injecção de Dependência na .NET Framework
Inversão de Controlo e Injecção de Dependência na .NET Framework
 
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - CaelumArquitetura e Design QCon2010 - Paulo Silveira - Caelum
Arquitetura e Design QCon2010 - Paulo Silveira - Caelum
 
Desenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHPDesenvolvimento para a Web com CakePHP
Desenvolvimento para a Web com CakePHP
 
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
Android Core Aula 7 - Aplicações (Services, Broadcast Receivers, NDK/JNI)
 
Teste unitário
Teste unitárioTeste unitário
Teste unitário
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
[CLPE] Design patterns com c#
[CLPE] Design patterns com c#[CLPE] Design patterns com c#
[CLPE] Design patterns com c#
 
Programação Orientada a Testes
Programação Orientada a TestesProgramação Orientada a Testes
Programação Orientada a Testes
 
Design Patterns (MSDN Webcast)
Design Patterns (MSDN Webcast)Design Patterns (MSDN Webcast)
Design Patterns (MSDN Webcast)
 

Mehr von Giovanni Bassi

Mehr von Giovanni Bassi (20)

O que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviçosO que aprendi montando a arquitetura de microsserviços
O que aprendi montando a arquitetura de microsserviços
 
Sendo ágil com git
Sendo ágil com gitSendo ágil com git
Sendo ágil com git
 
Analisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NETAnalisando dumps de memória de aplicações .NET
Analisando dumps de memória de aplicações .NET
 
Novidades do c# 7 e 8
Novidades do c# 7 e 8Novidades do c# 7 e 8
Novidades do c# 7 e 8
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Conhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetesConhecendo o AKS, o azure container services com kubernetes
Conhecendo o AKS, o azure container services com kubernetes
 
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
Novidades do .NET Core 2.1 e do ASP.NET Core 2.1
 
C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8C#7, 7.1, 7.2, 7.3 e C# 8
C#7, 7.1, 7.2, 7.3 e C# 8
 
Engenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deployEngenharia ágil de ponta a ponta do clone ao deploy
Engenharia ágil de ponta a ponta do clone ao deploy
 
Entrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineresEntrega contínua fica mais fácil com contêineres
Entrega contínua fica mais fácil com contêineres
 
.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2.NET Core, ASP.NET Core e .NET Standard 2
.NET Core, ASP.NET Core e .NET Standard 2
 
.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux.NET com contêineres Windows e Linux
.NET com contêineres Windows e Linux
 
Async e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agoraAsync e await com JavaScript: entenda e use agora
Async e await com JavaScript: entenda e use agora
 
Compartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.jsCompartilhando código entre frontend e backend com Node.js
Compartilhando código entre frontend e backend com Node.js
 
Construindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.jsConstruindo uma ferramenta CLI multiplataforma com Node.js
Construindo uma ferramenta CLI multiplataforma com Node.js
 
O Futuro do C#: C#8
O Futuro do C#: C#8O Futuro do C#: C#8
O Futuro do C#: C#8
 
Um mergulho nos containers windows
Um mergulho nos containers windowsUm mergulho nos containers windows
Um mergulho nos containers windows
 
Por dentro do .NET Core
Por dentro do .NET CorePor dentro do .NET Core
Por dentro do .NET Core
 
Build e release pipeline com docker
Build e release pipeline com dockerBuild e release pipeline com docker
Build e release pipeline com docker
 
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
Release contínuo de um microsserviço com Docker ASP.net core e Azure Containe...
 

Kürzlich hochgeladen

Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
Natalia Granato
 

Kürzlich hochgeladen (6)

Padrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemploPadrões de Projeto: Proxy e Command com exemplo
Padrões de Projeto: Proxy e Command com exemplo
 
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docxATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
ATIVIDADE 1 - GCOM - GESTÃO DA INFORMAÇÃO - 54_2024.docx
 
Assessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdfAssessement Boas Praticas em Kubernetes.pdf
Assessement Boas Praticas em Kubernetes.pdf
 
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docxATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
ATIVIDADE 1 - CUSTOS DE PRODUÇÃO - 52_2024.docx
 
Boas práticas de programação com Object Calisthenics
Boas práticas de programação com Object CalisthenicsBoas práticas de programação com Object Calisthenics
Boas práticas de programação com Object Calisthenics
 
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docxATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
ATIVIDADE 1 - LOGÍSTICA EMPRESARIAL - 52_2024.docx
 

Fazendo Injeção de dependência com Unity 1.2

  • 1. Fazendo injeção de dependência com Unity 1.2 Giovanni Bassi [email_address] http://unplugged.giggio.net Arquiteto de software independente
  • 2.  
  • 3. Online @ Giovanni Bassi Email : [email_address] Blog técnico: unplugged.giggio.net Site: giovannibassi.com Twitter: @giovannibassi .Net Architects Grupo: www.dotnetarchitects.net Podcast: podcast.dotnetarchitects.net Online: tinyurl.com/DotNetArch Twitter: #DotNetArchitects
  • 6.
  • 7.
  • 8. Inversão de dependência Serviço Interface gráfica
  • 9. Inversão de dependência Abstração serviço Serviço Interface gráfica
  • 10. Inversão de dependência Serviço Acesso a dados Utilidades Interface gráfica
  • 11. Inversão de dependência Abstração serviço Abstração de acesso a dados Abstração de utilidades Serviço Acesso a dados Utilidades Interface gráfica
  • 12. Recursos úteis Robert C. Martin (Uncle Bob) : Solid: butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod DI: objectmentor.com/resources/articles/dip.pdf Martin Fowler: martinfowler.com/bliki/InversionOfControl.html e http://martinfowler.com/articles/injection.html Wikipedia: en.wikipedia.org/wiki/Inversion_of_control
  • 13.  
  • 14.
  • 15. Sem injeção public class RepositorioPost { private GerenciadorConexaoBD _gerenciador;   public RepositorioPost() { _gerenciador = new GerenciadorConexaoBD (); } }
  • 16. Com Injeção public class RepositorioPost { private GerenciadorConexaoBD _gerenciador;   public RepositorioPost( GerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador ; } }
  • 17. Injeção pobre public class RepositorioPost { private IGerenciadorConexaoBD _gerenciador;   public RepositorioPost() : this(new GerenciadorConexaoBD ()) {} public RepositorioPost( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador; } }
  • 18. Flexibilidade de trocar a implementação Simplificação Desacoplamento Testes facilitados
  • 19. Complexidade Meio “mágico” Precisa configurar
  • 21.
  • 22.
  • 23. Tipos de injeção de dependência
  • 24.
  • 26. Constructor Injection public class RepositorioPost { public RepositorioPost( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador ; } } Classe com dependência:
  • 27. Constructor Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
  • 28. Property Injection public class RepositorioPost { [ Dependency ] public IGerenciadorConexaoBD Gerenciador { get ; set ; } } Classe com dependência:
  • 29. Propery Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
  • 30. Method call Injection public class RepositorioPost { private IGerenciadorConexaoBD _gerenciador; [ InjectionMethod ] public void Configurar( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador; } } Classe com dependência:
  • 31. Method call Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
  • 33. Injetando em objetos não construídos pelo contêiner
  • 34. Pós construção public class RepositorioPost { private IGerenciadorConexaoBD _gerenciador;   [ InjectionMethod ] public void Configurar( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador; } } Classe com dependência:
  • 35. Pós construção Resolvendo: _repositorio = new RepositorioPost (); conteiner.BuildUp(_repositorio);
  • 36.  
  • 37. Configurando var c = new UnityContainer (); c.RegisterType < IRepositorioPost , RepositorioPost >(); c.RegisterType < IGerenciadorConexaoBD , GerenciadorConexaoBD >(); Programaticamente:
  • 38. Configurando < section name = &quot; unity &quot; type = &quot; Microsoft.Practices.Unity.Configuration .UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 &quot; /> Com configuração:
  • 39. Configurando < unity > < containers > < container name = &quot; container &quot; > < types > < type type = &quot; BlogWeb.Models.IRepositorioPost, BlogWeb &quot; mapTo = &quot; BlogWeb.Models.RepositorioPost, BlogWeb &quot; /> </ types > </ container > </ containers > </ unity > Com configuração:
  • 41.  
  • 42.
  • 43. Teste // Arrange const string titulo = &quot;Um titulo&quot; ; var repositorio = new Mock < IRepositorioPost > ( MockBehavior .Strict); var post = new Post { Id = 1, Corpo = &quot;corpo&quot; , Titulo = titulo }; repositorio.Setup( r => r.ObterPost(titulo)).Returns(post); var controller = new PostsController (repositorio.Object);
  • 44. Teste // Act var result = controller.Post(titulo) as ViewResult ;   // Assert Assert .IsNotNull(result); Assert .IsNotNull(result.ViewData.Model); Assert .AreEqual(post, result.ViewData.Model); repositorio.VerifyAll();
  • 45. Demo Demo Incluindo DI em um projeto
  • 47. Recursos úteis Unity no Codeplex: unity.codeplex.com Unity no MSDN : msdn.microsoft.com/unity EntLib no Codeplex: entlib.codeplex.com EntLib no MSDN: msdn.microsoft.com/entlib Hands On Labs: tinyurl.com/unity12hol Blog do Leandro Daniel: reverb.leandrodaniel.com Artigo do Leandro Daniel na .Net Magazine (edição 62):
  • 48.
  • 50. Obrigado Giovanni Bassi [email_address] blog: http://unplugged.giggio.net
  • 51. Online @ Giovanni Bassi Email : [email_address] Blog técnico: unplugged.giggio.net Site: giovannibassi.com Twitter: @giovannibassi .Net Architects Grupo: www.dotnetarchitects.net Podcast: podcast.dotnetarchitects.net Online: tinyurl.com/DotNetArch Twitter: #DotNetArchitects