Automapper

De Banane Atomic
Aller à la navigationAller à la recherche

Description

Permet le mapping d'un objet de type A vers un objet de type B.
AutoMapper utilise des convention de mapping afin de réduire le paramétrage:

  • Propriétés de même nom
  • Flattening
  • Ignore les références null

Liens

Exemple

Csharp.svg
// initialiser dans Global.asax.cs ou App.xaml.cs
Mapper.Initialize(cfg => 
{
    cfg.CreateMap<A, B>()
    .ForMember(dst => dst.R1, opts => opts.MapFrom(src => src.Q1)  // définit un mapping A.Q1 → B.R1
    .ReverseMap();  // fait la liaison inverse B.R1 → A.Q1
});

A a = new A() { A1 = 1, P1 = 2, C1 = new C() { P1 = 3 } };
B b = Mapper.Map<A, B>(a);
// b.B1 = 1, b.P1 = 2, b.C1P1 = 3

// avec une liste
List<B> listB = Mapper.Map<List<A>, List<B>>(listA);

class A
{
    public int A1 { get; set; }
    public int P1 { get; set; }
    public C C1 { get; set; }
    public int Q1 { get; set; }
}

class B
{
    public int B1 { get; set; }    // mapping configuré avec A.A1
    public int P1 { get; set; }    // mapping par convention avec A.P1
    public int C1P1 { get; set; }  // mapping par flattening avec A.C1.P1
    public int R1 { get; set; }    // non mappé par défaut
}

class C
{
    public int P1 { get; set; }
}

Configuration en héritant de la classe Profile

AProfile.cs
internal sealed class AProfile : Profile
{
    public AProfile()
    {
        this.CreateAToBMapping();
        this.CreateBToAMapping();
    }

    private void CreateAToBMapping()
    {
        this.CreateMap<A, B>()
            .ForMember(dest => dest.B1, opt => opt.MapFrom(src => src.A1));
    }

    private void CreateBToAMapping()
    {
        this.CreateMap<B, A>()
            .ForMember(dest => dest.A1, opt => opt.MapFrom(src => src.B1));;
    }
}
Startup.cs
// Scan for all profiles in an assembly
// static approach
Mapper.Initialize(cfg => cfg.AddProfiles(typeof(Startup).Assembly));

// instance approach
var mapperConfiguration = new MapperConfiguration(
    cfg =>
    {
        cfg.AddCollectionMappers();
        // Scan for all profiles in an assembly
        cfg.AddProfiles(typeof(Startup).Assembly);
    });

mapperConfiguration.AssertConfigurationIsValid();

// injection de dépendance
var services = new ServiceCollection();
services.AddSingleton(mapperConfiguration);
services.AddSingleton(sf => sf.GetService<MapperConfiguration>().CreateMapper());

Installation

NuGet → AutoMapper

ASP.NET Core

NuGet → AutoMapper.Extensions.Microsoft.DependencyInjection

Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddAutoMapper();
MyController.cs
private readonly IMapper _mapper;

public MyController(IMapper mapper)
{
    _mapper = mapper;

    B b = _mapper.Map<A, B>(a);

Configuration dans Profile

MyProfile.cs
public class MyProfile : Profile
{
    public MyProfile()
    {
        CreateMap<A, B>();
    }
}