.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. |
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
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 :
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 |
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:
Endereco é um objeto complexo na classe Aluno mas apenas uma string na classe AlunoViewItem;
Nascimento é do tipo DateTime na classe Aluno mas é uma string na classe AlunoViewItem
Portanto temos que realizar alguns ajustes no método CreateMap no Mapper. Para o endereço podemos fazer assim:
Mapper.CreateMap<Aluno, AlunoViewItem>()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:
ListBox - name=lbDados
Button - name=btnCriarMapeamento
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)() _ Dim _alunoViewItem As AlunoViewItem = Mapper.Map(Of Aluno, AlunoViewItem)(aluno) lbDados.Items.Add(_alunoViewItem.Nome) 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:
ASP .NET Core - Criando uma aplicação Básica com Entity
ASP .NET Core - Como configurar o AutoMapper - Macoratti
ASP .NET Core MVC - Usando o AutoMapper - Macoratti
NET - Apresentando e usando AutoMapper