Automapper: двунаправленное отображение с помощью ReverseMap() и ForMember()
у меня есть случай, когда я хочу сопоставить сущность с viewmodel и обратно. Я должен явно указать сопоставление с ForMember (), потому что их свойства не имеют одинаковых имен. Вот краткий пример того, как выглядят мои классы:
public class PartTwo {
public int Integer { get; set; }
}
public class PartTwoViewModel {
public int PartInteger { get; set; }
}
и я хочу использовать их таким образом:
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);
но он не соответствует свойству PartInteger целочисленному. (Целое число 0.)
есть ли способ сделать эту работу? (Когда свойства обоих классы имеют одинаковые имена.) Должен ли я установить какой-то параметр в методе ForMember()?
2 ответов
вы можете определить свою конфигурацию следующим образом:
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));
обновление
здесь фиксация здесь ReverseMap
первоначально была реализована. Из того, что я вижу в коде, он создает только простое обратное отображение. Например, в этом случае он автоматически настроит эквивалент:
Mapper.CreateMap<PartTwoViewModel, PartTwo>();
чтобы получить что-то более сложное, я боюсь, что вам придется настроить его вручную.
ReverseMap
возвращает IMappingExpression
это представляет собой разворот отображения. После того, как вы позвоните, последующие вызовы будут для настройки разворота карты.
вот пример:
Mapper.CreateMap<CartItemDto, CartItemModel>()
.ForMember(dest => dest.ExtendedCost, opt => opt.Ignore())
.ReverseMap()
.ForMember(dest => dest.Pricing, opt => opt.Ignore())
это игнорировать Pricing
поле в обратном направлении.