2017-02-02 163 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)); 
相關問題