2016-02-10 49 views
2

隨着AutoMapper 4.2的發佈,靜態映射器接口已經過時,新推薦的方法是使用DI/IoC在需要的地方注入映射器。它是否仍然有可能調用mapper.map的地圖?

我正在將我的項目升級到此版本,並且已將我的配置移至Profile類的實現中。我遇到的問題是我的幾張地圖依賴於能夠撥打額外的Map電話。

這裏是地圖問題:

CreateMap<ProjectEntity, FavoritesNode>() 
    .ConstructUsing((ProjectEntity src) => Mapper.Map<FavoritesGroupModel>(src)) 
    .IgnoreMember(dest => dest.DisplayValue); 

CreateMap<ProjectEntity, FavoritesGroupModel>() 
    .MapMember(dest => dest.DisplayValue, src => src.ProjectName) 
    .MapMember(dest => dest.Items, src => src.Tasks); 

CreateMap<ProjectTaskEntity, FavoritesNode>() 
    .ConstructUsing((ProjectTaskEntity src) => Mapper.Map<FavoritesComboItemModel>(src)) 
    .IgnoreMember(dest => dest.DisplayValue); 

CreateMap<ProjectTaskEntity, FavoritesComboItemModel>() 
    .MapMember(dest => dest.DisplayValue, src => src.ProjectTaskName) 
    .MapMember(dest => dest.Key, src => src.Id) 
    .IgnoreMember(dest => dest.IsFavorite); 

FavoritesNode添加一些情況下,無論是FavoritesComboItemModelFavoritesGroupModel繼承和ProjectEntityProjectTaskEntity列表。這些映射用於將相當簡單的Project結構調整爲收藏夾模型用於完全動態的樹結構。

因此,給定這種配置是否有任何方法,我仍然可以在新的實例API中進行這些地圖調用?

* IgnoreMemberMapMember是我自己對相應的ForMember變體的快捷擴展。

回答

0

雖然沒有直接回答這個問題,同一個目標可以用As<T>方法上IMappingExpression

實現下面是這個實現的問題樣本:

CreateMap<ProjectEntity, FavoritesNode>() 
    .As<FavoritesGroupModel>(); 

CreateMap<ProjectEntity, FavoritesGroupModel>() 
    .MapMember(dest => dest.DisplayValue, src => src.ProjectName) 
    .MapMember(dest => dest.Items, src => src.Tasks); 

CreateMap<ProjectTaskEntity, FavoritesNode>() 
    .As<FavoritesComboItemModel>(); 

CreateMap<ProjectTaskEntity, FavoritesComboItemModel>() 
    .MapMember(dest => dest.DisplayValue, src => src.ProjectTaskName) 
    .MapMember(dest => dest.Key, src => src.Id) 
    .IgnoreMember(dest => dest.IsFavorite); 
2

是的,這是相當容易。

對於ConstructUsing方法,您有一個重載接收帶有ResolutionContext參數的Func。解析上下文有一個引擎屬性,它持有對當前正在映射的映射引擎的引用。

這將是這個樣子:

CreateMap<ProjectTaskEntity, FavoritesNode>() 
    .ConstructUsing(ctx => ctx.Engine.Map<FavoritesComboItemModel>(ctx.SourceValue)) 
    .IgnoreMember(dest => dest.DisplayValue); 

還有接收映射上下文ResolveUsing超載。

+1

太棒了,謝謝你添加一個涵蓋被問到的直接問題的答案。 – Phaeze

相關問題