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

Loading...

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

0 comments

Post a comment

    Post a comment
    Embed Video
    Edit your comment Cancel

    Favorites, Groups & Events

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

    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
    4. Agenda
    5. Inversão de dependência
    6. Tudo começou...
      • Módulos de alto nível não devem depender de módulos de baixo nível. Ambos devem depender de abstrações.
      • Abstracões não devem depender de detalhes. Detalhes devem depender de abstrações. Uncle Bob (1996)
    7. Inversão de dependência
      • Princípio da inversão de dependência
      • Também conhecido como inversão de controle
      • Use interfaces ou abstract classes
      • Discussões vem de 1988 (mais de 20 anos)
      • Dependência é transitiva
    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. Injeção de dependência
      • “ Injetar” uma dependência significa passar uma classe que será utilizada para a classe que irá consumi-la
      • Há várias maneiras de fazer isso. As mais comuns são:
        • Construtor
        • Propriedades
        • Interfaces
    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
    20. O Unity
    21. Unity
      • O Unity é parte do Enterprise Library
        • (Mas também pode ser usado sem ela)
    22. Unity
      • É um contêiner de injeção de dependência (DI)
      • Usado também para interceptação (AOP style)
      • Pode resolver cadeias inteiras de dependências
      • Pode resolver dependências de objetos não construídos por ele
    23. Tipos de injeção de dependência
    24. Tipos de DI
      • O Unity permite os seguintes tipos de injeção de dependência:
        • Constructor
        • Method Injection
        • Property Injection (Setter Injection)
    25. Cenário
    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 >()
    32. Use constructor injection
    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:
    40. Roadmap
    41.  
    42. Testes
      • Implemente inversão de controle no componente que quer testar unitariamente
      • Utilize Mocks
      • Teste!
    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
    46. Links e recursos úteis
    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):
      • Em 06/Out teremos um webcast relacionado:
      • Codificando certo com
        • ASP.NET MVC
        • Entity Framework 4.0
        • DDD
    48. Perguntas?
    49. Obrigado Giovanni Bassi [email_address] blog: http://unplugged.giggio.net
    50. 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
    SlideShare Zeitgeist 2009

    + Giovanni BassiGiovanni Bassi Nominate

    custom

    426 views, 0 favs, 1 embeds more stats

    Webcast feito em 29/09/2009 via MSDN

    More info about this document

    © All Rights Reserved

    Go to text version

    • Total Views 426
      • 288 on SlideShare
      • 138 from embeds
    • Comments 0
    • Favorites 0
    • Downloads 0
    Most viewed embeds
    • 138 views on http://unplugged.giggio.net

    more

    All embeds
    • 138 views on http://unplugged.giggio.net

    less

    Flagged as inappropriate Flag as inappropriate
    Flag as inappropriate

    Select your reason for flagging this presentation as inappropriate. If needed, use the feedback form to let us know more details.

    Cancel
    File a copyright complaint
    Having problems? Go to our helpdesk?

    Categories