O 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
- Visual Studio 2022 (.NET 6.0)
- Nuget package Automapper e AutoMapper.Extensions.Microsoft.DependencyInjection
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 GitHub: https://github.com/hgmauri/sample-automapper
[…] 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 […]