Utilizando AutoMapper no C# \| TreinaWeb               Promoção no ar   Matricule-se agora e garanta **54% de desconto**  

  Termina em   Tempo restante da oferta: 04 Horas 

 57 Min 

 22 Seg 

   Tempo restante da oferta: 04 57 22 

  [Assinar →](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26) 

   [                ](https://www.treinaweb.com.br)  Explorar  

 [ Quanto custa? ](#assinatura) [ FAQ ](https://www.treinaweb.com.br#faq) [Matricule-se](#assinatura) [ Entrar ](https://www.treinaweb.com.br/login) 

     [ Início ](https://www.treinaweb.com.br) [ Artigos ](https://www.treinaweb.com.br/blog) Utilizando AutoMapper no C#  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

# Utilizando AutoMapper no C#

 Conheça a biblioteca AutoMapper e aprenda como implementá-la em uma aplicação C#.

 [ Wladimilson M. Nascimento ](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento) 7 anos atrás

  ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/03/18140521/AUTOMAPPER.png)  

Ao criar uma aplicação, a recomendação mais ouvida (e que deveria ser a mais seguida) é a separação de responsabilidade entre as camadas do sistema. Existem vários padrões de projetos que auxiliam na implementação deste processo, sendo MVC o mais popular. Hoje há uma infinidade de frameworks baseados neste padrão.

Entretanto em algumas situações apenas ele não garante isso, pode ser necessário ter um desacoplamento maior entre as camadas. Para facilitar este processo, temos o AutoMapper.

## AutoMapper

O [AutoMapper](http://automapper.org/) é uma biblioteca open-source criada por [Jimmy Bogard](https://jimmybogard.com/) para resolver um problema enganosamente complexo, que é o mapeamento de um objeto para outro. Este tipo de tarefa geralmente é chata e tediosa, então esta pequena biblioteca foi criada para resolver esta situação de forma simples.

[  ![C# (C Sharp) - ASP.NET MVC](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/csharp-avancado-asp-net.svg)   Curso C# (C Sharp) - ASP.NET MVC Conhecer o curso ](https://www.treinaweb.com.br/curso/csharp-avancado-asp-net-mvc)

## Mapeando uma Model para uma ViewModel

O AutoMapper é mais utilizado em aplicações [ASP.NET MVC](https://www.treinaweb.com.br/blog/operacoes-crud-no-asp-net-mvc-5-com-o-ado-net/), principalmente quando esta aplicação faz uso do padrão [MVVM (Model-View-ViewModel)](https://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93viewmodel), mas como pode ser utilizado em qualquer tipo de aplicação e para facilitar a explicação, aqui veremos os exemplos do uso desta biblioteca em uma aplicação console simples.

Entretanto, antes de vermos o AutoMapper na prática, vamos compreender o problema que resolve.

Ao implementar padrão MVVM, haverão duas classes com características equivalentes: uma que refletirá o domínio, e.g, [uma entidade do Entity Framework](https://www.treinaweb.com.br/blog/entity-framework-core-com-mysql/); e outra que refletirá a View, a interface da aplicação. Para ilustrar isso, imagine uma entidade `Cliente`:

```csharp
public class Cliente
{
    public long Id { get; set; }
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
    public DateTime DataNascimento { get; set; }
    public double Renda { get; set; }

    public override string ToString()
		=> $"{Id} - {Nome} - {Sobrenome} - {DataNascimento} - {Renda}";
}

```

Na interface de visualização dos clientes, não deve ser exibido a renda. Desta forma, cria-se uma ViewModel com a seguinte estrutura:

```csharp
public class ClienteListViewModel
{
    public long Id { get; set; }
    public string Nome { get; set; }
    public string Sobrenome { get; set; }
    public DateTime DataNascimento { get; set; }

    public override string ToString()
		=> $"{Id} - {Nome} - {Sobrenome} - {DataNascimento}";
}

```

Para mapear os dados de `Cliente` para `ClienteListViewModel`, podemos fazê-lo manualmente da seguinte forma:

```csharp
static void Main(string[] args)
{
    var cliente = new Cliente()
    {
        Id = 1,
        Nome = "Carlos",
        Sobrenome = "Silva",
        DataNascimento = new DateTime(1980, 03, 12),
        Renda = 4012.04
    };
    var clienteViewModel = new ClienteListViewModel()
    {
        Id = cliente.Id,
        Nome = cliente.Nome,
        Sobrenome = cliente.Sobrenome,
        DataNascimento = cliente.DataNascimento
    };

    Console.WriteLine(clienteViewModel);
    Console.ReadLine();
}

```

Algo simples. Agora imagine ter que trabalhar com uma entidade que possui vinte propriedades, caso haja muitos registros, ou mesmo, com várias entidades implementando o padrão MVVM? É possível ver que este tipo de tarefa simples pode se tornar complicado com adição de poucos detalhes.

É para facilitar este tipo de ação que o AutoMapper foi criado.

## AutoMapper vem ao resgate

Para utilizar esta biblioteca em um projeto é necessário adicioná-la via NuGet:

```dos
dotnet add package AutoMapper

```

Na sua utilização básica, é necessário criar uma configuração que indica como as classes são mapeadas:

```csharp
var configuration = new MapperConfiguration(cfg =>
{
    cfg.CreateMap();
});

```

Em `CreateMap` deve ser informado a classe de origem dos objetos (`Cliente`) e a classe de destino (`ClienteListViewModel`). Caso também seja realizado o mapeamento inverso, isso deve ser informado nesta configuração:

```csharp
var configuration = new MapperConfiguration(cfg =>
{
    cfg.CreateMap();
    cfg.CreateMap();
});

```

A partir da configuração cria-se um objeto `Mapper`:

```csharp
var mapper = configuration.CreateMapper();

```

Que irá aplicar o mapeamento:

```csharp
var clienteViewModel = mapper.Map(cliente);

```

## Perfis de entidade

Como as ViewModels refletem as interfaces da aplicação, em alguns projetos uma entidade pode gerar várias ViewModels. Para facilitar a organização dos mapeamentos dessas ViewModels, o AutoMapper permite a criação de perfis (`Profile`) para uma entidade:

```csharp
public class ClienteProfile: Profile
{
    public ClienteProfile()
    {
        CreateMap();
        CreateMap();
    }
}

```

Com isso, na hora de criar a configuração, indica-se o perfil da entidade:

```csharp
var configuration = new MapperConfiguration(cfg =>
{
    cfg.AddProfile();
});

```

Outra vantagem de se utilizar perfis é que pode ser informado o assembly da aplicação:

```csharp
var configuration = new MapperConfiguration(cfg =>
{
    cfg.AddMaps(typeof(Program).Assembly);
});

```

E o AutoMapper irá analisa-lo para carregar os perfis definidos no código. Este tipo de recurso é muito útil quando a aplicação define vários perfis de entidade.

## Mapeamento customizado

Caso ambos os objetos possuam propriedades com os mesmos nomes, como no nosso exemplo até o momento, o mapeamento do AutoMapper é automático, mas pode haver situações onde isso não ocorre.

Por exemplo, vamos modificar a nossa classe `ClienteListViewModel` para o código abaixo:

```csharp
public class ClienteListViewModel
{
    public long Id { get; set; }
    public string NomeCompleto { get; set; }
    public DateTime DataNascimento { get; set; }

    public override string ToString()
		=> $"{Id} - {NomeCompleto} - {DataNascimento}";
}

```

Isso não irá gerar erro no nosso projeto, mas a biblioteca não saberá mapear o valor de `NomeCompleto`, assim esta propriedade não receberá nenhum dado.

Então é necessário informar como essa propriedade deve ser mapeada:

```csharp
CreateMap()
    .ForMember(dst => dst.NomeCompleto,
                    map => map.MapFrom(src => $"{src.Nome} {src.Sobrenome}"));

```

Acima estamos dizendo que a propriedade `NomeCompleto` em `ClienteListViewModel `deve ser mapeada para os valores de `Nome` e `Sobrenome` de `Cliente`.

[  ![Windows Server 2016 - Internet Information Services](https://d2knvm16wkt3ia.cloudfront.net/assets/svg-icon/windows-server.svg)   Curso Windows Server 2016 - Internet Information Services Conhecer o curso ](https://www.treinaweb.com.br/curso/windows-server-2016-internet-information-services)

## Conclusão

O uso básico da biblioteca AutoMapper é muito simples, o que facilita a adoção do padrão MVVM. Além disso, mesmo sendo pequena, possui muitos recursos, que não foram abordados por completo aqui.

Existem outras bibliotecas que realizam este tipo de procedimento, mas caso necessite fazer este tipo de mapeamento no seu projeto, ou esteja pensando em desacoplar as camadas da sua aplicação, o AutoMapper é uma ótima pedida.

Por hoje é só! Até a próxima :)

- [ #ASP .NET MVC ](https://www.treinaweb.com.br/blog/tag/asp-net-mvc)
- [ #C ](https://www.treinaweb.com.br/blog/tag/c)
- [ #MVVM ](https://www.treinaweb.com.br/blog/tag/mvvm)
- [ #MVC ](https://www.treinaweb.com.br/blog/tag/mvc)
- [ #AutoMapper ](https://www.treinaweb.com.br/blog/tag/automapper)

Autor

 ![Wladimilson M. Nascimento](//secure.gravatar.com/avatar/f0dd442f156a3eacd2880e9cd0eafbd1?d=mm)

## Wladimilson M. Nascimento

 Instrutor, nerd, cinéfilo e desenvolvedor nas horas vagas. Graduado em Ciências da Computação pela Universidade Metodista de São Paulo. 

 [Todos os artigos](https://www.treinaweb.com.br/blog/autor/wladimilson-m-nascimento)  

## Continue estudando

 Transforme leitura em prática com os cursos e formações da TreinaWeb.

 [Ver cursos](https://www.treinaweb.com.br/cursos)   

  Continue lendo

## Artigos relacionados

- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/05/05142558/mediator-pattern-com-mediatr-no-asp-net-core-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     7 anos atrás

    ##  [ Mediator Pattern com MediatR no ASP.NET Core ](https://www.treinaweb.com.br/blog/mediator-pattern-com-mediatr-no-asp-net-core) 

     Manter os objetos isolados é o objetivo do Mediator Pattern. No ASP.NET Core a sua implementação é facilitada com a biblioteca MediatR.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/08/EJS-400x280.png)  [ Node ](https://www.treinaweb.com.br/blog/categoria/node-js) 

     5 anos atrás

    ##  [ Utilizando template engine EJS com Node.js ](https://www.treinaweb.com.br/blog/utilizando-template-engine-ejs-com-node-js) 

     Neste artigo vamos aprender a utilizar a Template Engine EJS com Node.js e também alguns recursos interessantes desta ferramenta.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/04/utilizando-arquivos-dotenv-env-em-uma-aplicacao-asp-net-core-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Utilizando arquivos Dotenv (.env) em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-arquivos-dotenv-env-em-uma-aplicacao-asp-net-core) 

     O uso de arquivos .env é quase o padrão de aplicações web, veja como utilizá-los em uma aplicação ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/04/utilizando-o-mysql-em-uma-aplicacao-c-400x280.png)  [ Desenvolvimento Back-end ](https://www.treinaweb.com.br/blog/categoria/desenvolvimento-back-end) 

     6 anos atrás

    ##  [ Utilizando o MySQL em uma aplicação C ](https://www.treinaweb.com.br/blog/utilizando-o-mysql-em-uma-aplicacao-c) 

     Veja as configurações necessárias para utilizar o MySQL em uma aplicação C.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2021/02/Estrutuas-condicao-repeticao-jinja2-400x280.png)  [ Flask ](https://www.treinaweb.com.br/blog/categoria/flask) 

     6 anos atrás

    ##  [ Utilizando estruturas de condição e repetição no Jinja2 ](https://www.treinaweb.com.br/blog/utilizando-estruturas-de-condicao-e-repeticao-no-jinja2) 

     Veja neste artigo como utilizar estruturas de condição e repetição no Jinja2.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/08/hybrid-orm-repodb-no-asp-net-core-400x280.png)  [ C# ](https://www.treinaweb.com.br/blog/categoria/csharp) 

     6 anos atrás

    ##  [ Utilizando o hybrid ORM RepoDb em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-hybrid-orm-repodb-em-uma-aplicacao-asp-net-core) 

     Um meio termo entre o Dapper e o Entity Framework, o hybrid ORM RepoDb é uma ótima opção de ORM para aplicações intermediárias.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2020/06/nhibernate-no-asp-net-core-400x280.png)  [ ASP .NET ](https://www.treinaweb.com.br/blog/categoria/asp-net) 

     7 anos atrás

    ##  [ Utilizando o NHibernate em uma aplicação ASP.NET Core ](https://www.treinaweb.com.br/blog/utilizando-o-nhibernate-em-uma-aplicacao-asp-net-core) 

     O NHibernate é uma biblioteca madura e muito utilizada que agora fornece suporte para o .NET Core. Veja um exemplo do NHibernate no ASP.NET Core.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/11/08085435/app-flask-css-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     7 anos atrás

    ##  [ Utilizando arquivos estáticos no Flask ](https://www.treinaweb.com.br/blog/utilizando-arquivos-estaticos-no-flask) 

     Veja neste artigo como utilizar arquivos estáticos em projetos Flask.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/07/23115642/CHAVE-PRIMÁRIA-DJANGO-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     7 anos atrás

    ##  [ Utilizando Choices no Django ORM ](https://www.treinaweb.com.br/blog/utilizando-choices-no-django-orm) 

     Veja neste artigo como utilizar os choices no Django ORM.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/05/16092331/DJANGO-REDIS-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Utilizando o Redis como Cache em um projeto Django ](https://www.treinaweb.com.br/blog/utilizando-o-redis-como-cache-em-um-projeto-django) 

     Neste artigo veremos como utilizar o Redis como Cache de aplicações Django.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2019/03/11152338/ARQUIVOS-ESTÁTICOS-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Utilizando arquivos estáticos em um projeto Django ](https://www.treinaweb.com.br/blog/utilizando-arquivos-estaticos-em-um-projeto-django) 

     Veja neste artigo como configurar e utilizar arquivos estáticos em projetos Django.

     Ler artigo
- ![](https://dkrn4sk0rn31v.cloudfront.net/uploads/2018/07/24104425/heranca-python-400x280.png)  [ Python ](https://www.treinaweb.com.br/blog/categoria/python) 

     8 anos atrás

    ##  [ Utilizando herança no Python ](https://www.treinaweb.com.br/blog/utilizando-heranca-no-python) 

     Veja na prática como usar herança no Python.

     Ler artigo

## Um ano de acesso total para você viver de programação.

 Todos os cursos e formações da TreinaWeb numa única assinatura, com professores que atuam no mercado, suporte direto e certificados. Do primeiro `console.log` ao mercado de trabalho.

- **1 ano** de acesso a **todos os cursos**
- Cursos novos **toda semana**
- Suporte **direto com professores**
- Plano de carreira **personalizado**
- **Certificados digitais** inclusos
- **Aplicativos** para Android e iOS, com **acesso offline**

    **Garantia incondicional de satisfação** 

 Teste por 7 dias e, se não fizer sentido para você, devolvemos seu dinheiro.

### Acesso completo a todos os cursos e dezenas de Formações.

 12 meses 

  Economize R$ 840,00  54% OFF 

 de 12x R$ 129,00 por apenas

 12x  R$ 59,00

 sem juros no cartão de crédito ou R$ 599,00 à vista

  Oferta termina em  **04h 57min 22s**

- Acesso imediato e ilimitado durante 1 ano.
- Plano de carreira personalizado.
- Suporte direto com professores.
- E muito mais!

 [Matricule-se agora](https://www.treinaweb.com.br/checkout/pagamento/plano/anual?cupom=TW-SCLIENTE26)

     [                ](https://www.treinaweb.com.br)

 Escola online de programação, tecnologia e IA.

- [  ](https://www.facebook.com/TreinaWeb/)
- [  ](https://www.instagram.com/treinaweb/)
- [  ](https://www.youtube.com/user/TreinaWeb)
- [  ](https://twitter.com/treinaweb)
- [  ](https://www.linkedin.com/company/treinaweb)
- [  ](https://github.com/treinaweb)

## Inscreva-se em nossa newsletter

Receba lançamentos, promoções e novidades.

   Seu nome     Seu WhatsApp     Seu melhor e-mail   Inscrever-se 

## Cursos

- [ Base para Devs ](https://www.treinaweb.com.br/categoria/base-para-devs)
- [ Front-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-front-end)
- [ Back-end ](https://www.treinaweb.com.br/categoria/desenvolvimento-back-end)
- [ Mobile ](https://www.treinaweb.com.br/categoria/desenvolvimento-mobile)
- [ Bancos de Dados ](https://www.treinaweb.com.br/categoria/bancos-de-dados)
- [ Cloud ](https://www.treinaweb.com.br/categoria/cloud-computing)
- [ IA ](https://www.treinaweb.com.br/categoria/ia)
- [ E mais ](https://www.treinaweb.com.br/categoria/e-mais)
- [ Ver todos os cursos ](https://www.treinaweb.com.br/cursos)

## Conteúdo

- [ Formações ](https://www.treinaweb.com.br/formacoes)
- [ Projetos práticos ](https://www.treinaweb.com.br/projetos-praticos)
- [ Direto ao ponto ](https://www.treinaweb.com.br/direto-ao-ponto)
- [ Planos ](https://www.treinaweb.com.br#assinatura)
- [ Depoimentos ](https://www.treinaweb.com.br#depoimentos)
- [ Comunidade ](https://www.treinaweb.com.br#comunidade)
- [ Corpo docente ](https://www.treinaweb.com.br#docente)

## A empresa

- [ Sobre a TreinaWeb ](https://www.treinaweb.com.br#sobre)
- [ Perguntas frequentes ](https://www.treinaweb.com.br#faq)
- [ Vantagens de estudar na TreinaWeb ](https://www.treinaweb.com.br/vantagens-de-estudar-na-treinaweb)
- [ Cursos para empresas ](https://www.treinaweb.com.br/empresas)
- [ Sugira um novo curso ](https://www.treinaweb.com.br/sugerir-curso)
- [ Trabalhe conosco ](https://www.treinaweb.com.br/trabalhe-conosco)
- [ Artigos ](https://www.treinaweb.com.br/blog)
- [ Desenvolvedores e agentes ](https://www.treinaweb.com.br/developers)
- [ Contato ](https://www.treinaweb.com.br/contato)
- [ Política de privacidade ](https://www.treinaweb.com.br/politica-de-privacidade)
- [ Termos de uso ](https://www.treinaweb.com.br/termos-de-uso)

## Baixe nosso aplicativo

 [   Disponível na **App Store**  ](https://apps.apple.com/us/app/treinaweb/id1322729447) [   Disponível no **Google Play**  ](https://play.google.com/store/apps/details?id=br.com.treinaweb.mobile) 

  Av. Paulista, 1765, Conj 71 e 72 · Bela Vista · São Paulo · SP · 01311-200   © 2004 – 2026 TreinaWeb Tecnologia LTDA · CNPJ 06.156.637/0001-58
