委托会员映射子对象与AutoMapper(delegating Member mapping to

2019-09-28 04:04发布

我有从源类和内类源类的结合性质的目标类。

class Source {
  public int Id {get;set;}
  public int UseThisInt {get;set;}
  public InnerType Inner {get;set;}
  // other properties that the Destination class is not interested in
}
class InnerType {
  public int Id {get;set;}
  public int Height {get;set;}
  // more inner properties
}

我的目的地类应结合UseThisInt和的所有属性InnerType

class Destination {
  public int Id {get;set;}
  public int UseThisInt {get;set;}
  public int Height {get;set;}
  // more inner properties that should map to InnerType
}

现在我AutoMapper配置是这样的:

CreatMap<Source, Destination>()
  .ForMember(d => d.Id, o => o.MapFrom(s => s.Inner.Id))
  .ForMember(d => d.Height, o => o.MapFrom(s => s.Inner.Height));

AutoMapper将正确映射UseThisInt之间的SourceDestination ,但我希望能够让它像目的地的所有其他属性映射Height没有明确ForMember配置。

我试着使用

Mapper.Initialize(cfg => cfg.CreateMap<Source, Destination>()
  .ForMember(d => d.Id, o => o.MapFrom(s => s.Inner.Id))
  .ForMember(d => d.UseThisInt, o => o.MapFrom(s => s.UseThisInt))
  .ForAllOtherMembers(o => o.MapFrom(source=> source.Inner))
);

,但并没有达到预期的结果,离开Destination.Height不变。

Answer 1:

AutoMapper的大多数示例演示创建从一些源对象的新目标对象,但AutoMapper也可以用于更新现有的对象服用从源对象被映射和留下任何其余性能不变的那些属性。

因此,能够从源到在多个步骤中的目的地进行映射。


所以,如果你创建一个映射配置InnerType像这样: -

Mapper.Initialize(cfg => {
    cfg.CreateMap<Source, Destination>();
    cfg.CreateMap<InnerType, Destination>();
});

然后你就可以利用这个能力通过映射到目标对象两次叠加的映射。

var dest = Mapper.Map<Destination>(src);
Mapper.Map(src.Inner, dest);

一个缺点这种方法是,你需要使用映射器生成一个目标对象时要留意这一点。 但是,你必须声明你AutoMapper配置中第二个映射步骤作为的选项AfterMap指令。

Mapper.Initialize(cfg => {
        cfg.CreateMap<Source, Destination>()
            .AfterMap((src, dest) => Mapper.Map(src.Inner, dest));
        cfg.CreateMap<InnerType, Destination>();
    });

有了这个更新的配置,你可以用一个地图调用执行映射: -

var dest = Mapper.Map<Destination>(src);


文章来源: delegating Member mapping to child object with AutoMapper
标签: c# AutoMapper