Fazendo injeção de dependência com Unity 1.2 Giovanni Bassi [email_address] http://unplugged.giggio.net Arquiteto de softw...
 
Online @ Giovanni Bassi Email :   [email_address] Blog técnico:  unplugged.giggio.net  Site:  giovannibassi.com  Twitter: ...
Agenda
Inversão de dependência
Tudo começou... <ul><li>Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstra...
Inversão de dependência <ul><li>Princípio da inversão de dependência </li></ul><ul><li>Também conhecido como inversão de c...
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 Utili...
Recursos úteis Robert C. Martin (Uncle Bob) : Solid:  butunclebob.com/ArticleS.UncleBob.PrinciplesOfOod  DI:  objectmentor...
 
Injeção de dependência <ul><li>“ Injetar” uma dependência significa passar uma classe que será utilizada para a classe que...
Sem injeção public   class   RepositorioPost { private   GerenciadorConexaoBD  _gerenciador;   public  RepositorioPost() {...
Com Injeção public   class   RepositorioPost { private   GerenciadorConexaoBD  _gerenciador;   public  RepositorioPost( Ge...
Injeção pobre public   class   RepositorioPost { private   IGerenciadorConexaoBD  _gerenciador;   public  RepositorioPost(...
Flexibilidade de trocar  a implementação Simplificação Desacoplamento Testes facilitados
Complexidade Meio “mágico” Precisa configurar
O Unity
Unity <ul><li>O Unity é parte do Enterprise Library </li></ul><ul><ul><li>(Mas também pode ser usado sem ela) </li></ul></ul>
Unity <ul><li>É um contêiner de injeção de dependência (DI) </li></ul><ul><li>Usado também para interceptação (AOP style) ...
Tipos de injeção de dependência
Tipos de DI <ul><li>O Unity permite os seguintes tipos de injeção de dependência: </li></ul><ul><ul><li>Constructor </li><...
Cenário
Constructor Injection public   class   RepositorioPost { public  RepositorioPost( IGerenciadorConexaoBD  gerenciador) { _g...
Constructor Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
Property Injection public   class   RepositorioPost   { [ Dependency ] public   IGerenciadorConexaoBD  Gerenciador  {  get...
Propery Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
Method call Injection public   class   RepositorioPost { private   IGerenciadorConexaoBD  _gerenciador; [ InjectionMethod ...
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 ] pub...
Pós construção Resolvendo: _repositorio =  new   RepositorioPost (); conteiner.BuildUp(_repositorio);
 
Configurando var  c =  new   UnityContainer (); c.RegisterType < IRepositorioPost ,  RepositorioPost >(); c.RegisterType <...
Configurando < section   name = &quot; unity &quot; type = &quot; Microsoft.Practices.Unity.Configuration .UnityConfigurat...
Configurando < unity > < containers > < container   name = &quot; container &quot; > < types > < type   type = &quot; Blog...
Roadmap
 
Testes <ul><li>Implemente inversão de controle no componente que quer testar unitariamente </li></ul><ul><li>Utilize Mocks...
Teste // Arrange const   string  titulo =  &quot;Um titulo&quot; ; var  repositorio =  new   Mock < IRepositorioPost >  ( ...
Teste // Act var  result = controller.Post(titulo)  as   ViewResult ;   // Assert Assert .IsNotNull(result); Assert .IsNot...
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:  entl...
<ul><li>Em 06/Out teremos um webcast relacionado: </li></ul><ul><li>Codificando certo com </li></ul><ul><ul><li>ASP.NET MV...
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: ...
Upcoming SlideShare
Loading in …5
×

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

3,215 views

Published on

Webcast feito em 29/09/2009 via MSDN

Published in: Technology, Spiritual
0 Comments
2 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
3,215
On SlideShare
0
From Embeds
0
Number of Embeds
829
Actions
Shares
0
Downloads
0
Comments
0
Likes
2
Embeds 0
No embeds

No notes for slide

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

  1. 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
  3. 4. Agenda
  4. 5. Inversão de dependência
  5. 6. Tudo começou... <ul><li>Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações. </li></ul><ul><li>Abstracões não devem depender de detalhes. Detalhes devem depender de abstrações. Uncle Bob (1996) </li></ul>“
  6. 7. Inversão de dependência <ul><li>Princípio da inversão de dependência </li></ul><ul><li>Também conhecido como inversão de controle </li></ul><ul><li>Use interfaces ou abstract classes </li></ul><ul><li>Discussões vem de 1988 (mais de 20 anos) </li></ul><ul><li>Dependência é transitiva </li></ul>
  7. 8. Inversão de dependência Serviço Interface gráfica
  8. 9. Inversão de dependência Abstração serviço Serviço Interface gráfica
  9. 10. Inversão de dependência Serviço Acesso a dados Utilidades Interface gráfica
  10. 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
  11. 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
  12. 14. Injeção de dependência <ul><li>“ Injetar” uma dependência significa passar uma classe que será utilizada para a classe que irá consumi-la </li></ul><ul><li>Há várias maneiras de fazer isso. As mais comuns são: </li></ul><ul><ul><li>Construtor </li></ul></ul><ul><ul><li>Propriedades </li></ul></ul><ul><ul><li>Interfaces </li></ul></ul>
  13. 15. Sem injeção public class RepositorioPost { private GerenciadorConexaoBD _gerenciador;   public RepositorioPost() { _gerenciador = new GerenciadorConexaoBD (); } }
  14. 16. Com Injeção public class RepositorioPost { private GerenciadorConexaoBD _gerenciador;   public RepositorioPost( GerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador ; } }
  15. 17. Injeção pobre public class RepositorioPost { private IGerenciadorConexaoBD _gerenciador;   public RepositorioPost() : this(new GerenciadorConexaoBD ()) {} public RepositorioPost( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador; } }
  16. 18. Flexibilidade de trocar a implementação Simplificação Desacoplamento Testes facilitados
  17. 19. Complexidade Meio “mágico” Precisa configurar
  18. 20. O Unity
  19. 21. Unity <ul><li>O Unity é parte do Enterprise Library </li></ul><ul><ul><li>(Mas também pode ser usado sem ela) </li></ul></ul>
  20. 22. Unity <ul><li>É um contêiner de injeção de dependência (DI) </li></ul><ul><li>Usado também para interceptação (AOP style) </li></ul><ul><li>Pode resolver cadeias inteiras de dependências </li></ul><ul><li>Pode resolver dependências de objetos não construídos por ele </li></ul>
  21. 23. Tipos de injeção de dependência
  22. 24. Tipos de DI <ul><li>O Unity permite os seguintes tipos de injeção de dependência: </li></ul><ul><ul><li>Constructor </li></ul></ul><ul><ul><li>Method Injection </li></ul></ul><ul><ul><li>Property Injection (Setter Injection) </li></ul></ul>
  23. 25. Cenário
  24. 26. Constructor Injection public class RepositorioPost { public RepositorioPost( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador ; } } Classe com dependência:
  25. 27. Constructor Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
  26. 28. Property Injection public class RepositorioPost { [ Dependency ] public IGerenciadorConexaoBD Gerenciador { get ; set ; } } Classe com dependência:
  27. 29. Propery Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
  28. 30. Method call Injection public class RepositorioPost { private IGerenciadorConexaoBD _gerenciador; [ InjectionMethod ] public void Configurar( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador; } } Classe com dependência:
  29. 31. Method call Injection Resolvendo: _repositorio = conteiner.Resolve< RepositorioPost >()
  30. 32. Use constructor injection
  31. 33. Injetando em objetos não construídos pelo contêiner
  32. 34. Pós construção public class RepositorioPost { private IGerenciadorConexaoBD _gerenciador;   [ InjectionMethod ] public void Configurar( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador; } } Classe com dependência:
  33. 35. Pós construção Resolvendo: _repositorio = new RepositorioPost (); conteiner.BuildUp(_repositorio);
  34. 37. Configurando var c = new UnityContainer (); c.RegisterType < IRepositorioPost , RepositorioPost >(); c.RegisterType < IGerenciadorConexaoBD , GerenciadorConexaoBD >(); Programaticamente:
  35. 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:
  36. 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:
  37. 40. Roadmap
  38. 42. Testes <ul><li>Implemente inversão de controle no componente que quer testar unitariamente </li></ul><ul><li>Utilize Mocks </li></ul><ul><li>Teste! </li></ul>
  39. 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);
  40. 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();
  41. 45. Demo Demo Incluindo DI em um projeto
  42. 46. Links e recursos úteis
  43. 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):
  44. 48. <ul><li>Em 06/Out teremos um webcast relacionado: </li></ul><ul><li>Codificando certo com </li></ul><ul><ul><li>ASP.NET MVC </li></ul></ul><ul><ul><li>Entity Framework 4.0 </li></ul></ul><ul><ul><li>DDD </li></ul></ul>
  45. 49. Perguntas?
  46. 50. Obrigado Giovanni Bassi [email_address] blog: http://unplugged.giggio.net
  47. 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

×