DEV Community

Yuri Peixinho
Yuri Peixinho

Posted on • Edited on

.NET AutoMapper (DTOs)

Introdução

O AutoMapper é uma biblioteca utilizada para mapear objetos. Ele ajuda a resolver esse problema ao automatizar o mapeamento entre diferentes objetos de diferentes camadas, como entre entidades de bancos de dados e objetos de transferências de dados (DTOs). Isso facilita o desenvolvimento ao reduzir a quantidade de código manual para conversões, promovendo um maior desacoplamento e flexibiliade do projeto.

O problema que o AutoMapper resolve

Imagine que você tem uma aplicação que têm muitas entidades e DTOs parecidos, como por exemplo Product. Você precisará mapear manualmente dezenas ou centenas de classes e DTO, e fazer isso

Exemplo didático do problema

Vamos retomar o exemplo do Product, descrito acima.

Imagine que você tem um Model de Product:

public class Product
{
    public int Id { get; set; }
    public string Name { get; set; }
    public decimal Price { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

E um DTO que representa o que você quer enviar ao cliente sem o ID:

public class ProductDTO
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}
Enter fullscreen mode Exit fullscreen mode

O problema é: toda vez que você quiser converter de Product -> ProductDTO, você teria que escrever:

var productDTO = new ProductDTO
{
    Name = product.Name,
    Price = product.Price
};
Enter fullscreen mode Exit fullscreen mode

e quando for o contrário (DTO → Entidade)

var product = new Product
{
    Name = productDTO.Name,
    Price = productDTO.Price
};
Enter fullscreen mode Exit fullscreen mode

Essa prática em projetos de pequeno porte pode ser eficiente, mas em projetos grandes significa:

  • Muito código repetitivo
  • Alta chance de erro (esquecer um campo, errar um nome, etc.).
  • Difícil manutenção (se mudar o nome de uma propriedade, você precisará alterar em todos os lugares)

Exemplo didático da solução (AutoMapper)

O papel do automapper é automatizar essa conversão. Ele faz um mapeamento de propriedades entre objetos de tipos diferentes, desde que o nomes e tipos sejam compatíveis.

  1. Primeiro você cria uma configuração de mapeamento (Profile)
using AutoMapper;

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Product, ProductDTO>(); // diz como mapear de Product → ProductDTO
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. Depois registra essa configuração no seu projeto (normalmente no Program.cs ou em arquivo de configurações como método de extensão)
using AutoMapper;

public class MappingProfile : Profile
{
    public MappingProfile()
    {
        CreateMap<Product, ProductDTO>(); // diz como mapear de Product → ProductDTO
    }
}
Enter fullscreen mode Exit fullscreen mode
  1. E finalmente, em qualquer lugar do código, você pode converter objetos facilmente:
var productDTO = _mapper.Map<ProductDTO>(product);
Enter fullscreen mode Exit fullscreen mode

Desse modo o AutoMapper automatica copia as propriedades Name, Price sem você precisar escrever nada disso manualmente.

Registrar serviços do AutoMapper

O registro do automapper pode ser feito de diferentes maneiras, e dependem da estrutura e do tamanho do projeto.

Ele deve ser feito uma única vez no ponto central da aplicação, onde o container de injeção de dependência deve ser configurado

Dependendo da arquitetura, isso pode ficar em lugares diferentes:

  • Program.cs (projetos .NET 6+)
  • Startup.cs (projetos .NET 5 ou anteriores)
  • um método de extensão (boa prática para Clean Architecture)

Projeto simples sem camadas

Nos projetos mais simples, geralmente configuramos no Program.cs do projeto:

using AutoMapper;
using MyApp.Mappings; // pasta onde ficam seus Profiles

var builder = WebApplication.CreateBuilder(args);

// Registro do AutoMapper
builder.Services.AddAutoMapper(typeof(MappingProfile));

var app = builder.Build();

app.Run();
Enter fullscreen mode Exit fullscreen mode

Projeto com Clean Architecture

Esse é o cenário mais comuns em projetos profisisonais. A ideia é criar um método de extensão para centralizar os registros dessa camada:

using Microsoft.Extensions.DependencyInjection;
using System.Reflection;

namespace MyApp.Application
{
    public static class DependencyInjection
    {
        public static IServiceCollection AddApplication(this IServiceCollection services)
        {
            services.AddAutoMapper(Assembly.GetExecutingAssembly());
            return services;
        }
    }
}
Enter fullscreen mode Exit fullscreen mode

Quando usar vs. Quando não usar

É importante entender o contexto de arquitetura e escalabilidade do projeto antes de decidir utilizar o AutoMapper.

Situação Recomendação
Muitos DTOs parecidos e simples ✅ AutoMapper é ótimo
Projeto pequeno / poucos mapeamentos ❌ Faça manualmente
Precisa de controle fino / regras de negócio ❌ Manual
Busca performance máxima ⚠️ Prefira Mapster ou manual

Alternativas modernas ao AutoMapper

Mapster: mais rápido e com menos configuração.

Manual mapping + extensions: simples e explícito, ideal para APIs pequenas:

public static UserDto ToDto(this User user) =>
    new UserDto(user.Id, user.Name, user.Email);
Enter fullscreen mode Exit fullscreen mode

Top comments (0)