2017-02-02 98 views
2

我想从源的子对象映射到目标(作为父对象)。Automapper - 如何从源子对象映射到目标

源模型:

public class SourceBaseResponse<T> where T : new() 
{ 
    public string Type { get; set; } 

    public string Id { get; set; } 

    public T Attributes { get; set; } 
} 

对于我的例子中我使用T-为类型SourceAssignment的

public class SourceAssignment 
{ 
    public string Id { get; set; } 

    public string Email { get; set; } 

    public string EmployeeId { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public DateTimeOffset CreatedAt { get; set; } 

} 

目标对象

public class DestinationAssignment 
{ 
    public string Id { get; set; } 

    public string Email { get; set; } 

    public string FirstName { get; set; } 

    public string LastName { get; set; } 
} 

我想源模型直接映射到目的地。所以,我试图用

CreateMap<SourceAssignment, DestinationAssignment>(); 
CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>() 
      .ForMember(dest => dest, opt => opt.MapFrom(src => AutoMapperConfig.Mapper.Map<DestinationAssignment>(src.Attributes))); 

,因为我在上面行获得运行时错误这不是工作“为成员自定义配置仅支持一个类型的顶级个人会员。”

所以,每this thread我尝试以下

CreateMap<SourceBaseResponse<SourceAssignment>, DestinationAssignment>() 
      .AfterMap((src, dst) => Mapper.Map(src.Attributes, dst)); 

现在,我得到错误的映射应该发生它说“映射器未初始化。调用适当的配置初始化。如果你试图使用映射器通过容器或其他方式实例,请确保您没有任何对静态Mapper.Map方法的调用,并且如果您使用的是ProjectTo或UseAsDataSource扩展方法,请确保您传入相应的IConfigurationProvider实例。

我能够使用ForMember每个属性和src.Attributes它映射到dest(对于如:src.Attribute.Id到dest.Id)。这是有效的,但我真的不想这样做,因为我的Source是涉及嵌套子元素的复杂类(因为这是一个Web API响应,我无法控制这个)。所以很多定制映射在这里完成

CreateMap<SourceAssignment, DestinationAssignment>(); 

关于如何继续的任何建议。

+0

的'AfterMap'表达式使用静态'Mapper',所以要确定它已配置(即静态映射器具有SourceAssignment的映射 - > DestinationAssignment)。也许你正在配置一个实例,而不是静态映射器? –

+0

@GeorgPatscheider它是一个静态映射器。如果没有从SourceBaseResponse进行映射,我可以将它用于自动映射源到目标。 – sam113

回答

2

分辨率方面是需要能够调用Mapper.Map(),您可以通过使用ConstructUsing()获取分辨率方面:

CreateMap<SourceChild, Destination>(); 
CreateMap<Source, Destination>() 
    .ConstructUsing((src, ctx) => ctx.Mapper.Map<Destination>(src.SourceChild)); 
相关问题