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)
“
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
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
“ 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
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
O Unity é parte do Enterprise Library
(Mas também pode ser usado sem ela)
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
Tipos de injeção de dependência
Tipos de DI
O Unity permite os seguintes tipos de injeção de dependência:
Constructor
Method Injection
Property Injection (Setter Injection)
Cenário
Constructor Injection public class RepositorioPost { public RepositorioPost( IGerenciadorConexaoBD gerenciador) { _gerenciador = gerenciador ; } } Classe com dependência:
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 = " unity " type = " Microsoft.Practices.Unity.Configuration .UnityConfigurationSection, Microsoft.Practices.Unity.Configuration, Version=1.2.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 " /> Com configuração:
Implemente inversão de controle no componente que quer testar unitariamente
Utilize Mocks
Teste!
Teste // Arrange const string titulo = "Um titulo" ; var repositorio = new Mock < IRepositorioPost > ( MockBehavior .Strict); var post = new Post { Id = 1, Corpo = "corpo" , 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):
Em 06/Out teremos um webcast relacionado:
Codificando certo com
ASP.NET MVC
Entity Framework 4.0
DDD
Perguntas?
Obrigado Giovanni Bassi [email_address] blog: http://unplugged.giggio.net
0 comments
Post a comment