AutoMapper : mapping automatique d'objets en .NET

AutoMapper simplifie la transformation d'objets en gérant automatiquement le mapping entre classes similaires.

Installation

dotnet add package AutoMapper

Configuration

Déclarez vos profils et enregistrez le mapper au démarrage pour une utilisation via injection de dépendances.

var config = new MapperConfiguration(cfg => {
  cfg.AddProfile(new UserProfile());
});
IMapper mapper = config.CreateMapper();
services.AddSingleton(mapper);

Configuration manuelle

var mappingConfig = new MapperConfiguration(mc =>
{
  mc.AddProfile(new UserProfile());
});

IMapper mapper = mappingConfig.CreateMapper();
services.AddSingleton(mapper);

Un profil simple

public class UserEntity
{
  public int Id { get; set; }
  public string FirstName { get; set; }
  public string LastName  { get; set; }
  public DateTime BirthDate { get; set; }
}

public class UserDto
{
  public int Id { get; set; }
  // FullName: concatenation of FirstName + LastName
  public string FullName { get; set; }
  // Age: calculated from BirthDate
  public int Age { get; set; }
}
public class UserProfile : Profile
{
  public UserProfile()
  {
    CreateMap<UserEntity, UserDto>()
      .ForMember(dest => dest.FullName,
             opt  => opt.MapFrom(src => $"{src.FirstName} {src.LastName}"))
      .ForMember(dest => dest.Age,
             opt  => opt.MapFrom(src => DateTime.Today.Year - src.BirthDate.Year));
  }
}

Usage

var userEntity = new UserEntity { Id = 1, FirstName = "Jean", LastName = "Dupont", BirthDate = new DateTime(1990,5,20) };
UserDto dto = _mapper.Map<UserDto>(userEntity);

// dto.FullName == "Jean Dupont"
// dto.Age     == (int)(...)
// dto.Id      == 1

Mapping bidirectionnel

CreateMap<UserDto, UserEntity>()
    .ForMember(dest => dest.FirstName,
               opt  => opt.MapFrom(src => src.FullName.Split(' ')[0]))
    .ForMember(dest => dest.LastName,
               opt  => opt.MapFrom(src => src.FullName.Split(' ')[1]));

Note : si le format de FullName change, mets à jour les profils ou extrait la logique dans une méthode partagée.

Mapper des collections

Tu peux mapper des listes sans boucle explicite :

List<UserDto> dtos = _mapper.Map<List<UserDto>>(entities);
Écrit le 2025-08-14