Automapper: mappage bidirectionnel avec ReverseMap () et ForMember()

J'ai le cas où je veux mapper une entité à un viewmodel et retour. Je dois spécifier le mappage explicitement avec ForMember() car leurs propriétés ne partagent pas exactement les mêmes noms. Voici un petit exemple de la façon dont mes classes ressemblent:

public class PartTwo {
    public int Integer { get; set; }
}

public class PartTwoViewModel {
    public int PartInteger { get; set; }
}

Et je veux les utiliser de cette façon:

Mapper.CreateMap<PartTwo, PartTwoViewModel>()
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer))
    .ReverseMap();

var partTwoViewModel = new PartTwoViewModel() { PartInteger = 42 };
var partTwo = Mapper.Map<PartTwoViewModel, PartTwo>(partTwoViewModel);
Assert.AreEqual(partTwoViewModel.PartInteger, partTwo.Integer);

Mais il ne correspond pas à la propriété PartInteger à Integer. (Entier est 0.)

Y a-t-il un moyen de faire fonctionner cela? (Lorsque les propriétés des deux classes ont les mêmes noms elle fonctionne.) Dois-je définir une sorte d'option dans la méthode ForMember()?

48
demandé sur Mightymuke 2012-11-21 13:49:36

2 réponses

, Vous pouvez définir votre configuration comme ceci:

Mapper.CreateMap<PartTwo, PartTwoViewModel>()
    .ForMember(dst => dst.PartInteger, opt => opt.MapFrom(src => src.Integer));

Mapper.CreateMap<PartTwoViewModel, PartTwo>()
    .ForMember(dst => dst.Integer, opt => opt.MapFrom(src => src.PartInteger));

Mise à jour

Voici le commit ReverseMap a été initialement implémenté. D'après ce que je peux voir dans le code, il ne crée qu'un simple mappage inverse. Par exemple, dans ce cas, il configurerait automatiquement l'équivalent de:

Mapper.CreateMap<PartTwoViewModel, PartTwo>();

Pour obtenir quelque chose de plus complexe, j'ai peur que vous deviez le configurer manuellement.

46
répondu Mightymuke 2012-11-22 01:47:35

ReverseMap renvoie un IMappingExpression qui représente l'inversion du mappage. Une fois que vous appelez, les appels suivants seront pour configurer l'inversion de la carte.

Voici un exemple:

Mapper.CreateMap<CartItemDto, CartItemModel>()
      .ForMember(dest => dest.ExtendedCost, opt => opt.Ignore())
      .ReverseMap()
          .ForMember(dest => dest.Pricing, opt => opt.Ignore())

Cela ignorera le champ Pricing dans le sens inverse.

127
répondu Jon Wingfield 2013-08-28 13:57:57