【问题标题】:Automapper merge/combine mappingsAutomapper 合并/组合映射
【发布时间】:2012-12-18 18:20:42
【问题描述】:

假设我有这些映射:

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

更新:编辑问题更具体

【问题讨论】:

  • 为什么你不能这样做:var mapping1 = Mapper.CreateMap() .ForMember(o => o.Referrer, m => m.Ignore())。 ForMember(o => o.Price, m => m.Ignore());?
  • @Icarus 这有点复杂,因为映射有不同的目的地。我更新了问题。

标签: c# automapper-2


【解决方案1】:

我想知道它是否是一个错误。 documentation 声明:

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

我建议你 create an issue 看看他们怎么说。

【讨论】:

    【解决方案2】:

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

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

    总结:

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

    这表明,在这种情况下,您需要为从 BastDto 派生的每种类型的映射重复 Ignore()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多