AutoMapper: copiando valores de um objeto para outro sem complicações

Copiar diversos valores de um objeto para outro é uma necessidade bastante comum, sobretudo quando se procura ocultar detalhes de implementação de uma tecnologia específica (o Id gerado automaticamente pelo MongoDB constitui um ótimo exemplo disto). Em situações como esta um objeto com uma estrutura mais genérica será criado para expor os dados esperados, de maneira que construções ou outras aplicações que dependam de uma funcionalidade específica se preocupem apenas com dados que considerem essenciais.

Dentro da plataforma .NET temos uma alternativa que soluciona este tipo de demanda com bastante flexibilidade: trata-se do projeto open source conhecido como AutoMapper!

Através do uso do AutoMapper há a possibilidade de se mapear campos que correspondam em 2 tipos, mas cujos nomes muitas vezes sequer coincidem. Transformações de valores envolvendo um ou mais campos na origem para um equivalente no objeto de destino também são possíveis.

Para ativar o uso do AutoMapper em uma aplicação ASP.NET Core será adicionado o package AutoMapper.Extensions.Microsoft.DependencyInjection (o exemplo a seguir também utiliza MongoDB):

Na listagem a seguir temos as classes ItemCatalogoDocument e FornecedorProduto, ambas representando um documento de uma coleção do MongoDB que pode se referir a um produto ou serviço:

A ideia no exemplo descrito nesta seção é evitar expor diretamente o tipo ItemCatalogoDocument, já que o mesmo contém o Id gerado de maneira automática pelo MongoDB (propriedade _id). Para isto serão implementadas as classes Produto, Fornecedor e Servico:

Aerá criada a classe de mapeamento MappingProfile a fim de simplificar a transferência de valores de objetos do tipo ItemCatalogoDocument para instâncias de Produto e Servico:

  • O tipo MappingProfile deriva de Profile (namespace AutoMapper), estrutura básica utilizada pelo AutoMapper na configuração de mapeamentos entre tipos;
  • No construtor de MappingProfile foram definidos mapeamentos entre as classes ItemCatalogoDocument para instâncias de Produto e Servico, além de FornecedorProduto e Fornecedor;
  • Os mapeamentos foram realizados por meio de chamadas ao método ForMember. Campos cujos nomes coincidam na origem e no destino não precisam ser mapeados explicitamente.

Temos ainda o tipo CatalogoContext para consulta aos dados do MongoDB, com o método GetItem retornando instâncias de ItemCatalogoDocument:

Na classe Startup será necessário configurar a utilização do AutoMapper a partir de uma chamada ao método AddAutoMapper, informando como parâmetro a classe de mapeamentos MappingProfile (linha 23):

Já em CatalogoController uma instância de IMapper será recebida no construtor via injeção de dependências (linha 20), com os métodos GetProduto e GetServico fazendo uso deste objeto para converter os retornos gerados por CatalogoContext em GetItem:

Utilizando o projeto indicado no seguinte repositório do GitHub para carga de dados:

.NET Core 3.1 + Console Application + MongoDB + Serilog + Dados de Produtos/Serviços

Teremos como resultado ao consultar produtos e serviços:

Os fontes do exemplo detalhado nesta seção também foram disponibilizados no GitHub:

ASP.NET Core 3.1 + API REST + MongoDB + AutoMapper + Dados de Produtos/Serviços

GitHub Actions: build e deployment automatizado de aplicações

Alternativa oferecida pelo GitHub e compatível com diversas plataformas, com GitHub Actions temos a possibilidade de montar workflows automatizando o build de nossas aplicações com o deployment nos mais diferentes serviços. No caso do ASP.NET Core, partindo da montagem de um workflow baseado em .NET Core e contando com Actions para deployment em servidores IIS, serviços do Azure, Amazon, Google Cloud

A seguir listei repositórios em que disponibilizei workflows para aplicações ASP.NET Core:

GitHub Actions + ASP.NET Core 3.1 + Azure CLI + Azure App Service + Variables + Secrets

GitHub Actions + ASP.NET Core 3.1 + Tests + Azure CLI + Azure App Service

Diversos artigos em que cobri o build/deployment de aplicações ASP.NET Core com GitHub Actions:

Docker + GitHub Actions | parte 1: build automatizado de aplicações

Docker + GitHub Actions | parte 2: deployment automatizado de aplicações

GitHub Actions: exemplos de workflows para build e deployment em várias tecnologias

ASP.NET Core + xUnit + GitHub Actions: automatizando testes, build e deployment de Web Apps

Kubernetes: dicas e truques na orquestração de containers | Parte 4 (inclui workflow para deploymento no Azure Kubernetes Service)

GitHub Actions | Guia de Referência Gratuito

E uma live do Canal .NET em que a combinação ASP.NET Core + GitHub Actions foi abordada extensivamente:

--

--

Renato Groffe
Renato Groffe

Written by Renato Groffe

Microsoft Most Valuable Professional (MVP), Multi-Plataform Technical Audience Contributor (MTAC), Software Engineer, Technical Writer and Speaker

No responses yet