Mapeando objetos com o Automapper no .NET

AutoMapper é uma biblioteca criada por Jimmy Bogard que realiza a simples tarefa de mapeamento de um objeto (classe) para outro, tanto que na própria documentação cita:

AutoMapper é uma pequena biblioteca simples construída para resolver um problema aparentemente complexo – livrar-se do código que mapeia um objeto para outro.

Vantagens

  • Mapeamento entre objetos de forma simples
  • Configuração simples
  • Lida com objetos complexos

Desvantagens

  • Performance ruim em alguns casos
  • Depuração complexa

Neste artigo, aprenderemos como configurar e utilizar o Automapper no .NET 6.0, seguindo as boas práticas e dicas para manter o código performático.

Pré-requisitos

API

O primeiro passo é configurar a classe program.cs:

A extensão AddAutoMapperApi() é responsável por registrar a injeção de dependência do Automapper na solução, sendo necessário passar um tipo de objeto que esteja no projeto onde contém as implementações dos profilers de mapeamento, neste caso, a classe MapperProfile.

O AllowNullCollections = true permite coleções de destino nulas. Se for false pode lançar uma exceção em casos onde as propriedades não são do mesmo tipo de dados.

O próximo passo é a configuração das classes GroupEntity e GroupViewModel:

  • GroupEntity: Representa a entidade do domínio e não deve ser propagada para outras áreas às quais ela não pertence, como a camada de apresentação.
  • GroupViewModel: Utilizado exclusivamente para necessidades da camada de apresentação.

A classe MapperProfile, que foi registrada em program.cs, contém todos os mapeamentos entre os objetos do tipo Entity e ViewModel:

  • ReverseMap(): Realiza o mapeamento bilateral entre os objetos.
  • Ignore(): Ignora o mapeamento de uma propriedade específica.
  • AfterMap(): Modificações customizadas que são realizadas depois do mapeamento.

Com as configurações dos mapeamentos realizadas, já é possível sua utilização. Neste exemplo os mapeamentos entre objetos serão feitos na classe ClientApplication, onde é necessário o registro da injeção de dependência IMapper para realização das conversões.

E finalizando, é necessário configurar as chamadas dos métodos da classe ClientApplication no ClientController:

Testando

Para realizar os testes, execute o endpoint POST /api/client e POST /api/client/group no Swagger para verificar o mapeamento entre os tipos de objetos realizados na classe ClientApplication.

Dicas

O Automapper costuma ser um grande vilão de performance em médios e grandes projetos, com isso, aqui vão algumas dicas para reduzir o alto consumo de memória e processamento que ele provoca:

  • Evite várias classe de Profilers: Quanto menos melhor. Existe um alto custo no registro de diferentes classes de profile do Automapper.
  • Sempre utilize o ReverseMap: Evite criar vários CreateMap para mapeamentos bilaterais, o ReverseMap faz esse trabalho de forma simples e performática para sua aplicação.
  • Evite regras de negócio nas classes de mapeamento: O Automapper deve ser configurado apenas para mapeamento, evite regras, condições e chamadas de métodos de injeção de dependência dentro das classes profilers.

Se em nenhum caso houver benefício para seu projeto, experimente o Mapster.

Finalizando

O Automapper é utilizado para mapear objetos de tipos diferentes sem a necessidade de escrever grandes códigos para mapear cada membro de dados, resultando na economia de tempo do desenvolvimento. O ponto de atenção principal em sua utilização é na performance.

Se você deseja realizar mapeamentos com uma implantação rápida e simples, pode considerar o Automapper, mas se precisa de um bom desempenho, escolha o mapeamento manual.

Os detalhes completos deste exemplo você encontra no meu GitHubhttps://github.com/hgmauri/sample-automapper

1 Comment

  1. […] questões de segurança, também é possível utilizar o Automapper para realização de mapeamentos entre a ViewModel e Entidade, assim o usuário final não precisa […]

Leave a Comment

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