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()?
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 où 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.
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.