自动映射器: 使用 OverseMap()和 ForMember()进行双向映射

我有一个例子,我想把一个实体映射到一个视图模型,然后返回。我必须用 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);

但是它与属性 PartIntegerInteger不匹配(Integer0)

有办法解决吗?(当两个类的属性具有相同的名称时,它就可以工作。)我必须在方法 ForMember()中设置某种选项吗?

48425 次浏览

您可以这样定义您的配置:

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字段。