.NET - Apresentando e usando o AutoMapper


 Neste artigo eu vou apresentar o AutoMapper , uma biblioteca que realiza o mapeamento de propriedades de um objeto para outro, evitando assim que o desenvolvedor tenha o tedioso trabalho de realizar essa tarefa.

 

Já ouviu falar em um projeto simples e funcional ?

Pois o AutoMapper é exatamente isso : simples, funcional e genial.

Mas o que ele faz exatamente ?

O AutoMapper é uma biblioteca pequena e simples, criada para resolver um problema tedioso e complexo - evitar a codificação quando mapeamos um objeto para outro. Esse tipo de trabalho é bastante chato de fazer e sujeito a erros, então por que não inventar uma ferramenta para fazer isso por nós ? (fonte: http://automapper.org/)

Você pode obter o AutoMapper neste site : http://automapper.org/

Para consultar o guia de introdução que mostra como usar o AutoMapper acesse esse link: http://docs.automapper.org/en/stable/Getting-started.html

No artigo de hoje eu vou mostrar como usar o AutoMapper para facilitar a nossa vida de desenvolvedor.

Imagine o seguinte cenário:

Você tem um objeto Aluno que contém muitas propriedades e deseja exibir as informações desse objeto em um controle de formulário como um DataGridView, um ListBox, um TreeView, etc.

O código da classe Aluno é :

 public class Aluno
    {
        public string Nome { get; set; }
        public string Email { get; set; }
        public Endereco Endereco { get; set; }
        public string Genero { get; set; }
        public int Idade { get; set; }
        public DateTime Nascimento { get; set; }
    }

O código da classe Endereco é :

public class Endereco
{
        public string Pais { get; set; }
        public string Cidade { get; set; }
        public string Rua { get; set; }
        public string Cep { get; set; }
}

Para facilitar a exibição dos dados no controle de formulário você criou a classe AlunoViewItem com o seguinte código:

public class AlunoViewItem
{
  
public string Nome { get; set; }
   public string Email { get; set; }
  
public string Endereco { get; set; }
  
public string Genero { get; set; }
  
public int Idade { get; set; }
  
public string Nascimento { get; set
; }
}

Observe que na classe AlunoViewItem, as propriedades Endereco, Genero e Nascimento são do tipo string, justamente para facilitar a exibição das informações.

Com isso teremos que escrever código para mapear as propriedades da classe Aluno e Endereco para a classe AlunoViewItem. Seria algo assim :

AlunoViewItem viewItem = new AlunoViewItem();
viewItem.Nome = aluno.Nome;
viewItem.Email = aluno.Email;
viewItem.Endereco = aluno.Endereco.Cidade + aluno.Endereco.Rua;
viewItem.Genero = aluno.Genero == true ? "Masculino" : "Feminino";
viewItem.Idade = aluno.Idade;
viewItem.Nascimento = aluno.Nascimento.ToShortDateString();

É desse trabalho que o AutoMapper nos livra. (Imagine se a classe possuísse 50 propriedades ????)

Vamos usá-lo para realizar esse mapeamento com pouco código.

Então, ao trabalho...

 

Recursos usados :

Criando o projeto no VS Community

Abra o VS 2013 Community e clique em New Project;

A seguir clique em Other Project Types -> Visual Studio Solutions e selecione o template Blank Solution;

Informe o nome Usando_AutoMapper e clique no botão OK;

Com isso criamos uma solução em branco chamada Usando_AutoMapper. Vamos agora incluir um novo projeto nesta solução.

Clique no menu FILE e a seguir em Add -> New Project;

Selecione Visual C# -> Windows Destkop e a seguir o template Windows Forms Application;

Informe o nome CSharp_AutoMapper e clique no botão OK;

Vamos incluir neste projeto uma classe chamada Aluno.

Clique no menu PROJECT e a seguir em Add Class e informe o nome Aluno.

A seguir digite o código abaixo nesta classe:

using System;

namespace CSharp_AutoMapper
{
    public class Aluno
    {
        public string Nome { get; set; }
        public string Email { get; set; }
        public Endereco Endereco { get; set; }
        public bool Genero { get; set; }
        public int Idade { get; set; }
        public DateTime Nascimento { get; set; }
    }
}

Vamos criar também a classe Endereco para complementar a informação da classe Aluno visto que a propriedade Endereco da classe Aluno é do tipo Endereco:

O código da classe Endereco é visto a seguir:

    public class Endereco
    {
        public string Pais { get; set; }
        public string Cidade { get; set; }
        public string Rua { get; set; }
        public string Cep { get; set; }
    }

Agora vamos criar a classe AlunoViewItem com seguinte código :

 public class AlunoViewItem
 {
        public string Nome { get; set; }
        public string Email { get; set; }
        public string Endereco { get; set; }
        public string Genero { get; set; }
        public int Idade { get; set; }
        public string Nascimento { get; set; }
}

Agora é hora do AutoMapper entrar em ação para mapear as propriedades das classe Aluno e Endereco para a classe AlunoViewItem.

Usando o AutoMapper para mapear as propriedades entre objetos

Para poder usar o AutoMapper temos que referenciá-lo em nosso projeto. Agradeça ao Nuget que irá fazer isso para nós de forma automática.

Você pode usar o Manager Console e digitar :   Install-Package AutoMapper

Ou pode clicar no menu TOOLS -> Nuget Package Manager -> Manage Nuget Packages for Solution...

E selecionar o AutoMapper na janela - Manage Nuget Packages , clicando no botão Install para instalar a biblioteca no seu projeto:

Concluída a instalação podemos incluir uma declaração ao namespace AutoMapper:

using AutoMapper;

Para indicar ao AutoMapper o que mapear usamos a seguinte linha de código:

Mapper.CreateMap<Aluno, AlunoViewItem>();

Para realizar o mapeamento bastaria digitar a seguinte linha de código:

AlunoViewItem _alunoViewItem = Mapper.Map<Aluno, Aluno>(aluno);

Mas como já sabemos a nossa classe AlunoViewItem possui algumas inconsistências em relação à classe Aluno. Vejamos os problemas:

Portanto temos que realizar alguns ajustes no método CreateMap no Mapper. Para o endereço podemos fazer assim:

Mapper.CreateMap<Aluno, AlunoViewItem>()
   .ForMember(dest => dest.Endereco, m => m.MapFrom(a => a.Endereco.Cidade +
", "
+ a.Endereco.Rua));

Vejamos então como fica o mapeamento completo.

Criando a interface com o usuário

Vamos agora definir a interface com o usuário incluindo no formulário form1.cs do projeto os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Vamos definir no início do formulários os seguintes namespaces usados no projeto:

using System;

using System.Windows.Forms;

using AutoMapper;

Mapeando com AutoMapper

Agora vamos definir no evento Click do botão de comando - Criar Mapeamento com AutoMapper - o código  a seguir:

 private void btnCriarMapeamento_Click(object sender, EventArgs e)
 {
            Mapper.CreateMap<Aluno, AlunoViewItem>()
           .ForMember(av => av.Endereco,
                      m => m.MapFrom(a => a.Endereco.Cidade + ", " +
                                           a.Endereco.Rua)
                      )
            .ForMember(av => av.Nascimento, m => m.ResolveUsing(src =>
             {
                  var dt = (DateTime)src.Nascimento;
                  return dt.ToShortDateString();
              }));
            Aluno aluno = new Aluno
            {
                Nome = "Macoratti",
                Email = "macoratti@yahoo.com",
                Endereco = new Endereco
                {
                    Pais = "Brasil",
                    Cidade = "Brasilia",
                    Rua = "Rua Projetada 100",
                    Cep = "88900-520"
                },
                Genero = "Masculino",
                Idade = 35,
                Nascimento = new DateTime(1975, 10, 9)
            };
            AlunoViewItem _alunoViewItem = Mapper.Map<Aluno, AlunoViewItem>(aluno);

            lbDados.Items.Add(_alunoViewItem.Nome);
            lbDados.Items.Add(_alunoViewItem.Email);
            lbDados.Items.Add(_alunoViewItem.Endereco);
            lbDados.Items.Add(_alunoViewItem.Genero);
            lbDados.Items.Add(_alunoViewItem.Nascimento);
            lbDados.Items.Add(_alunoViewItem.Idade);
   }
C#

O código para a linguagem VB .NET ficaria assim:

   Imports AutoMapper

   Private Sub btnGerarMapeamento_Click(sender As Object, e As EventArgs)
                                                                    Handles btnGerarMapeamento.Click

        Mapper.CreateMap(Of Aluno, AlunoViewItem)() _
       .ForMember(Function(av) av.Endereco, Sub(m) m.MapFrom(Function(a)
                                           a.Endereco.Cidade + ", " + a.Endereco.Rua))

        Dim aluno As New Aluno() With
        { _
                    .Nome = "Macoratti", _
                   .Email = "macoratti@yahoo.com", _
                   .Endereco = New Endereco() With
                               { _
                               .Pais = "Brasil", _
                               .Cidade = "Brasilia", _
                               .Rua = "Rua Projetada 100", _
                               .Cep = "88900-520" _
                              }, _
                   .Genero = "Masculino", _
                   .Idade = 35, _
                   .Nascimento = New DateTime(1975, 10, 9) _
        }

        Dim _alunoViewItem As AlunoViewItem = Mapper.Map(Of Aluno, AlunoViewItem)(aluno)

        lbDados.Items.Add(_alunoViewItem.Nome)
        lbDados.Items.Add(_alunoViewItem.Email)
        lbDados.Items.Add(_alunoViewItem.Endereco)
        lbDados.Items.Add(_alunoViewItem.Genero)
        lbDados.Items.Add(_alunoViewItem.Nascimento)
        lbDados.Items.Add(_alunoViewItem.Idade)

    End Sub

Agora podemos executar o projeto e verificar o resultado conforme abaixo:

Colocando um ponto de interrupção podemos verificar o objeto _alunoViewItem que contem o mapeamento gerado conforme a figura abaixo:

O que vimos foi apenas uma introdução, o AutoMapper possui muitos outros recursos que iremos abordar em outros artigos.

Pegue o projeto completo aqui: Usando_AutoMapper.zip (projetos CSharp e VB .NET)

Jesus respondeu, e disse-lhe: Porque te disse: Vi-te debaixo da figueira, crês ? Coisas maiores do que estas verás.
E disse-lhe: Na verdade, na verdade vos digo que daqui em diante vereis o céu aberto, e os anjos de Deus subindo e descendo sobre o Filho do homem.

João 1:50,51

Referências:


José Carlos Macoratti