自动合并/组合映射

本文关键字:组合 映射 合并 | 更新日期: 2023-09-27 17:50:44

让我们假设我有这些映射:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());
var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .ForMember(o => o.Price, m => m.Ignore());
var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .ForMember(o => o.Temp, m => m.Ignore());

Dtos的继承:

DetailDto : BaseDto

UpdateDto : BaseDto

是否有办法合并/合并第一个映射到maping2和maping3 ?

像这样:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());
var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .Import(mapping1);
    .ForMember(o => o.Price, m => m.Ignore());
var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .Import(mapping1);
    .ForMember(o => o.Temp, m => m.Ignore());

.Include函数似乎不做我想要的,因为以下不工作:

var mapping1 = Mapper.CreateMap<Order, BaseDto>()
    .Include<Order, DetailDto>()
    .Include<Order, UpdateDto>()
    .ForMember(o => o.Referrer, m => m.Ignore());
var mapping2 = Mapper.CreateMap<Order, DetailDto>()
    .ForMember(o => o.Price, m => m.Ignore());
var mapping3 = Mapper.CreateMap<Order, UpdateDto>()
    .ForMember(o => o.Temp, m => m.Ignore());

更新:编辑的问题更具体

自动合并/组合映射

我想知道这是不是一个bug。文档说明:

在AutoMapper 2.0中,这变成了:

Mapper.CreateMap<Order, OrderDto>()
  .Include<OnlineOrder, OnlineOrderDto>()
  .Include<MailOrder, MailOrderDto>()
  .ForMember(o=>o.Id, m=>m.MapFrom(s=>s.OrderId));
Mapper.CreateMap<OnlineOrder, OnlineOrderDto>();
Mapper.CreateMap<MailOrder, MailOrderDto>();

因为已经为基类定义了映射,所以不再需要在子映射中定义它。

我刚刚升级到AutoMapper 2.2.1-ci9000,我得到了和你一样的行为(即,Referrer没有被忽视)。

我建议你为它创建一个问题,看看他们怎么说。

我意识到这有点晚了,但为了其他有类似问题的人的利益…

我也遇到了同样的问题,直到我在AutoMapper Github wiki上找到了这个页面。

在简介:

根据优先级评估继承配置(以解决多个映射对相同成员具有冲突配置的问题)。继承的Ignore()优先级低于AutoMapper的标准基于约定的映射。因此,当源类型和目标类型都具有Referrer属性时,大多数派生类型的基于约定的映射将覆盖继承的Ignore()

这表明,在本例中,您需要为从BastDto

派生的每种类型的映射重复Ignore()