Automapper une source vers plusieurs destinations

Aug 28 2020

Ci-dessous ma classe

class Dest1    
{    
 string prop1;
 string prop2;
 strig prop3;
 public Dest2 Dest2 {get;set;}
 pubic List<Dest3> Dest3 {get;set;}
}

class Dest2    
{   
 string prop4;
 string prop5;
 strig prop6;   
}

class Dest3        
{    
 string prop7;    
}

class Source1

{
 string prop1;
 string prop2;
 string prop3;
 string prop4;
 }
     class Source2
      {
 string prop7;
       }

J'ai besoin de cartographier

Q1. classe source1 à classe Dest1 (j'ai également besoin de mapper l'objet dest2)

Éditer:

Q2. Je dois faire la carte Dest1 vers la Source 1 (carte inversée)

J'utilise .net core et auto mapper .. suis nouveau sur automapper & .net core .. Merci d'avance

Réponses

3 reynoldsbj Aug 29 2020 at 06:17

AutoMapper peut mapper autant de sources vers autant de destinations que vous le souhaitez, en supposant que vous configuriez le mappage. Par exemple, votre scénario demandé:

var configuration = new MapperConfiguration(cfg =>
    // Mapping Config
    cfg.CreateMap<Source1, Dest2>()
        .ForMember(dest => dest.prop5, opt => opt.Ignore())
        .ForMember(dest => dest.prop6, opt => opt.Ignore());
    cfg.CreateMap<Source1, Dest1>()
        .ForMember(dest => dest.Dest2, opt => opt.MapFrom(src => src));

    // Reverse Mapping Config
    cfg.CreateMap<Dest1, Source1>()
        .ForMember(dest => dest.prop4,
                   opt => opt.MapFrom(src => (src?.Dest2 != null) // ?. w/c#6 
                                             ? src.Dest2.prop4 // map if can
                                             : null)); // otherwise null
);
// Check AutoMapper configuration
configuration.AssertConfigurationIsValid();

Les propriétés portant le même nom seront automatiquement mappées. Toutes les propriétés de destination qui n'ont pas de propriété source correspondante devront être ignorées.

Une fois que votre AutoMapper est configuré, vous pouvez mapper selon vos besoins à l'aide de l'interface IMapper.

public class Foo {
    private IMapper _mapper;
    public Foo(IMapper mapper) {
        _mapper = mapper;
    }

    // Map Source1 -> Dest1
    public Dest1 Bar(Source1 source) {
        return _mapper.Map<Dest1>(source);
    }

    // Map Dest1 -> Source1
    public Source1 Baz(Dest1 dest) {
        return _mapper.Map<Source1>(dest);
    }
}