ASP .NET Core - Usando o AutoMapper


 Hoje veremos como usar o AutoMapper em uma aplicação ASP .NET Core Web API.

 

Eu já apresentei o AutoMapper neste artigo:  Apresentando e usando o AutoMapper

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

O AutoMapper continua o mesmo, o que mudou foi a maneira de configurar a sua utilização em aplicações ASP .NET Core.

Para ilustrar como configurar o AutoMapper vamos criar uma aplicação Web API usando o .NET Core 2.1 no VS 2017 selecionando a opção ASP.NET Core Web Application e usando o template API. Vou chamar a solução e o projeto de API_AutoMapper.

Nesta aplicação vamos configurar o AutoMapper para mapear entre as classes Usuario e UsuarioDTO.

    public class Usuario
    {
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        public string Sexo { get; set; }
      
 public int Idade { get; set; }
        public Endereco Endereco { get; set; }

    }
  public class UsuarioDTO
  {
        public string Nome { get; set; }
        public string Sobrenome { get; set; }
        public string Sexo { get; set; }
        public string Cidade { get; set; }
  }

Nosso modelo de domínio também possui a classe Endereco:
 
  public class Endereco
  {
       public string Estado { get; set; }
       public string Cidade { get; set; }
       public string Cep { get; set; }
       public string Rua { get; set; }
       public int Numero { get; set; }
       public string Complemento { get; set; }
  }

Observe que a classe UsuarioDTO que é a classe cujos dados vamos expor possui a propriedade Cidade do tipo string que deverá ser mapeada para a propriedade Endereco na classe Usuario. O valor deverá ser obtido da classe Endereco.

Crie uma pasta Models no projeto e a seguir crie essas classes nesta pasta.

Vamos, ao trabalho...

 

Recursos usados :

Configurando o AutoMapper

Para poder usar o AutoMapper temos que incluir o pacote Nuget em nosso projeto.

No menu Tools-> Nuget Package Manager clique em Manage Nuget Packages for Solution;

Precisamos incluir também o pacote AutoMapper.Extensions.Microsoft.DependencyInjection conforme abaixo:

Nota: Podemos usar a injeção de dependência nativa também.

Com a solução criada e com os pacotes Nuget incluídos, abra o arquivo Startup e no método ConfigureServices inclua a linha de código destacada em azul conforme mostra o código a seguir:

        .....

        public void ConfigureServices(IServiceCollection services)
        {
            services.Configure<CookiePolicyOptions>(options =>
            {
                options.CheckConsentNeeded = context => true;
                options.MinimumSameSitePolicy = SameSiteMode.None;
            });

         services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);         

            services.AddAutoMapper();
        }
        ....

Estamos definindo uma instância para o serviço do AutoMapper ser injetado em nosos projeto.

Isso garante que, em vez de uma nova instância, a mesma instância do IMapper será usada toda vez que uma instância do IMapper for solicitada por um construtor no seu código.

Definindo o Mapeamento

Observando o código do nosso modelo percebemos que temos que definir na classe de perfil de mapeamento do AutoMapper e definir explicitamente o mapeamento entre a propriedade Cidade da classe UsuarioDTO e a propriedade Cidade da classe Endereco.

Para fazer isso podemos usar o recurso ForMember na classe de mapeamento chamada MappingProfile que iremos criar em uma pasta Mappings no projeto com o código a seguir:
 
using API_AutoMapper.Models;
using AutoMapper;

namespace API_AutoMapper.Mappings
{
    public class MappingProfile : Profile
    {
        public MappingProfile()
        {
            CreateMap<Usuario, UsuarioDTO>()
                .ForMember(dest => dest.Cidade,

                    opts => opts.MapFrom(src => src.Endereco.Cidade)).ReverseMap();
        }
    }
}

Observe a utilização do método ReverseMap() que permite mapear de ambos os lados.

Testando a implementação da API

Vamos agora criar um controlador chamado UsuarioController na pasta Controllers do tipo API Controller - Empty.

Um exemplo de utilização para realizar o mapeamento pode ser feito neste controlador conforme mostra o código a seguir:

using API_AutoMapper.Models;
using AutoMapper;
using Microsoft.AspNetCore.Mvc;

namespace API_AutoMapper.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsuarioController : ControllerBase
    {
        private readonly IMapper _mapper;
        private readonly Usuario _usuario;

        public UsuarioController(IMapper mapper)
        {
            _mapper = mapper;
            _usuario = new Usuario()
            {
                Nome = "Jose",
                Sobrenome = "Macoratti",
                Idade = 55,
                Sexo = "Masculino",
                Endereco = new Endereco()
                {
                    Cidade = "Lins",
                    Numero = 10,
                    Estado = "SP",
                    Cep = "999999"
                }
            };
        }

        [HttpGet]
        [Route("usuario")]
        public ActionResult<UsuarioDTO> GetUsuario()
        {
            return _mapper.Map<UsuarioDTO>(_usuario);
        }
    }
}

Note que no construtor do controlador UsuarioController injetamos uma instância de IMapper e definimos uma instância de Usuario onde criamos informações que iremos mapear para UsuarioDTO e exibir no navegador usando a url :  localhost:xxx/api/usuario/usuario

Abaixo vemos o resultado obtido :

Assim, vimos como é simples usar o AutoMapper com ASP .NET Core.

Pegue o projeto completo aqui: API_AutoMapper.zip

"Meus filhinhos, estas coisas vos escrevo, para que não pequeis; e, se alguém pecar, temos um Advogado para com o Pai, Jesus Cristo, o justo."
1 João 2:1

Referências:


José Carlos Macoratti