2012-11-21 31 views
42

Mam przypadek, w którym chcę odwzorować obiekt na viewmodel iz powrotem. Muszę wyraźnie określić odwzorowanie za pomocą ForMember(), ponieważ ich właściwości nie mają takich samych nazw. Oto krótki przykład jak moje zajęcia wyglądać następująco:Automapper: mapowanie dwukierunkowe z ReverseMap() i ForMember()

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

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

I chcę wykorzystać je w ten sposób:

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); 

Ale to nie pasuje własność PartInteger do liczby całkowitej. (Integer to 0.)

Czy istnieje sposób, aby to zadziałało? (Kiedy właściwości obu klas mają takie same nazwy, działa.) Czy muszę ustawić jakąś opcję w metodzie ForMember()?

Odpowiedz

42

Można określić konfigurację tak:

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)); 

UPDATE

Oto the commit gdzie ReverseMap początkowo realizowane. Z tego, co widzę w kodzie, tworzy tylko proste mapowanie odwrotne. Na przykład, w tym przypadku byłoby to automatycznie skonfigurować równowartość:

Mapper.CreateMap<PartTwoViewModel, PartTwo>(); 

dostać coś bardziej skomplikowane, obawiam się, że będziesz musiał go skonfigurować ręcznie.

+0

Tak, to działa. Miałem nadzieję, że nie będę musiał definiować mapowania odwrotnego, ponieważ mam wiele właściwości, które mapuję za pomocą ForMember(). – toni

+0

Oto przykład: https://dotnetfiddle.net/0x8csL – Sergey

118

ReverseMap zwraca wartość IMappingExpression reprezentującą odwrócenie odwzorowania. Gdy zadzwonisz, kolejne wywołania będą dotyczyły konfiguracji odwrócenia mapy.

Oto przykład:

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

to zignoruje pole Pricing w odwrotnym kierunku.

+0

Doskonały. Chociaż ponowne tworzenie mapowań członków jest wciąż niewygodne, jest to lepsze niż tworzenie zupełnie nowej mapy. – Cody

+1

Mój plus idzie tutaj. Oto przykład: https://dotnetfiddle.net/0x8csL – Sergey

+0

@jon Wingfield Doceniam twoją odpowiedź, ale jestem też nieco zdezorientowany. Jeśli nadal będę musiał powtórzyć całą możliwą rozmowę. Jeśli nie zadzwonię po wywołaniu ReverseMap, czy zdobędziesz coś? Czy to tylko to, że .ignore jest zepsuty? – JMarsch