Automapper:与ReverseMap()和ForMember双向映射()(Automappe

2019-07-04 00:20发布

我有我想要的实体映射到一个视图模型和后面的情况。 我必须与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()?

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

要得到任何东西更复杂,我怕你将不得不手动配置。



Answer 2:

ReverseMap返回IMappingExpression表示所述映射的逆转。 一旦你调用,它的后续调用将用于配置地图的逆转。

下面是一个例子:

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

这将忽略该Pricing在相反方向字段。



文章来源: Automapper: bidirectional mapping with ReverseMap() and ForMember()