Подтвердить что ты не робот

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 Integer. (Целое число равно 0.)

Есть ли способ сделать эту работу? (Когда свойства обоих классов имеют одинаковые имена, он работает.) Должен ли я устанавливать какую-то опцию в методе ForMember()?

4b9b3361

Ответ 1

Вы можете определить свою конфигурацию следующим образом:

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

Вот фиксация, где ReverseMap изначально была реализована. Из того, что я вижу в коде, он создает простое обратное отображение. Например, в этом случае он автоматически настроил бы эквивалент:

Mapper.CreateMap<PartTwoViewModel, PartTwo>();

Чтобы получить что-то более сложное, я боюсь, что вам придется настраивать его вручную.

Ответ 2

ReverseMap возвращает IMappingExpression, который представляет собой поворот отображения. После того, как вы вызовете, последующие вызовы будут предназначены для настройки изменения карты.

Вот пример:

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

Это игнорирует поле Pricing в обратном направлении.