Mapeando simple objects e complex objects com AutoMapper

Bom, para quem não sabe o que é o AutoMapper, segue uma definição retirada do próprio site do projeto:

“AutoMapper is a simple little library built to solve a deceptively complex problem – getting rid of code that mapped one object to another.”

Ou seja, é um biblioteca criada para mapeamento entre objetos.

Ao longo do artigo irei demonstrar exemplos de mapeamento entre objetos simples e complexos, além de demonstrar como configurar o mapeamento e exibir os prós e contras (no meu ponto de vista) quanto ao recurso/biblioteca.

Para o exemplo estarei utilizando Linq To SQL com um projeto em ClassLibrary.

Vamos considerar as seguintes informações:

Imagem 13 Mapeando simple objects e complex objects com AutoMapper

Imagem 1

Como é possível observar, temos 3 tabelas (tbTipo, tbGrupo e tbProduto)

Nosso DBML fica da seguinte forma:

Imagem 23 300x244 Mapeando simple objects e complex objects com AutoMapper

Imagem 2

Irei criar duas classes DTO para o mapeamento entre nosso modelo, Grupo_DTO e Produto_DTO, veja:

Mapeando objetos simples

Após efetuar o download da biblioteca, devemos utilizar o namespace AutoMapper.
O mapeamento com o AutoMapper é bem simples, basicamente, é necessário que seja definido como o mapeamento será efetuado, em seguida já é possível realizar efetivamente o mapeamento. Veja um exemplo simples, utilizando as classes Grupo e Grupo_DTO:

Desta forma o mapeamento já é efetuado, porém, podemos melhorar algumas coisas :). Vamos criar um método genérico, que realiza o mapeamento para qualquer objeto origem/destino:

Agora podemos utilizar algo como:

Mapeando objetos complexos

Analisando a classe Produto_DTO, podemos observar que algumas propriedades são diferentes quanto a classe Produto, como nomeTipo, nomeGrupo e data. Para que estas propriedades sejam preenchidas ao efetuar o mapeamento, devemos configura-las, observe:

Veja que:

  • O primeiro ForMember define que a propriedade dataCadastro vai preencher a propriedade data;
  • O segundo ForMember define que a propriedade nome presente no objeto Grupo vai preencher a propriedade nomeGrupo;
  • O ultimo ForMember define que a propriedade nome presente no objeto Tipo vai preencher a propriedade nomeTipo, porém, este verifica antes se o objeto Tipo possui valor.

Agora podemos realizar o mapeamento como anteriormente:

Observe que o mapeamento é efetuado com sucesso:

Imagem 31 Mapeando simple objects e complex objects com AutoMapper

Imagem 3

Porém…

Vá com calma, o AutoMapper não é perfeito

Isso mesmo, vou demonstrar o porque abrindo o SQL Profiler. Primeiramente vou executar uma query que realiza o mapeamento, porém apenas com Linq, veja:

Ao executarmos esta query o profiler do SQL server exibe o que realmente foi executado no BD:

Imagem 4 Mapeando simple objects e complex objects com AutoMapper

Imagem 4

Veja que foi executada apenas uma query. Ótimo. icon smile Mapeando simple objects e complex objects com AutoMapper

Agora vamos limpar o profiler e executar apenas a rotina que efetua o mapeamento com o AutoMapper, observe agora o resultado:

Imagem 5 Mapeando simple objects e complex objects com AutoMapper

Imagem 5

Veja o resutado, foram executadas diversas queries, na verdade o AutoMapper efetua uma query para cada join de seu mapeamento, no caso, com as tabelas tbTipo e tbGrupo. O criador do AutoMapper (Jimmy Bogard) está ciente do problema, e o mesmo até criou um post em blog comentando, explicando e demonstrando um solução paleativa quanto ao problema, (Solução essa que seria basicamente a criação de um método de extensão para IQueryable, onde seja permitido especificar exatamente qual será o retorno quando a consulta é executada)

Outro ótimo artigo sobre este erro pode ser visto aqui.

Bom, por hoje era isso e use o AutoMapper com moderação. icon wink Mapeando simple objects e complex objects com AutoMapper

 

Compartilhe
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  
  •  

2 thoughts on “Mapeando simple objects e complex objects com AutoMapper

  • comentario@leandroribeiro.com'
    4 de abril de 2012 at 21:03
    Permalink

    Muito boa postagem, especialmente falando do efeito colateral, a maioria das pessoas esquecem de relatar que nem tudo são flores.

    Parabéns.

    Reply
  • Pingback: URL

Deixe uma resposta

O seu endereço de email não será publicado Campos obrigatórios são marcados *

Você pode usar estas tags e atributos de HTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">