3

假设我有这些映射:

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

有什么方法可以将第一个映射合并/组合到 mapping2 和 mapping3 中?

像这样的东西:

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

更新:编辑问题更具体

4

2 回答 2

0

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

在 AutoMapper Github wiki 上找到此页面之前,我一直在为同样的问题苦苦挣扎。

总之:

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

这表明,在这种情况下,您需要为Ignore()BastDto

于 2014-07-23T14:06:12.903 回答
0

我想知道它是否是一个错误。该文档指出:

在 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没有被忽略)。

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

于 2013-01-05T06:52:50.390 回答