是否仍然可以使用地图来调用mapper.map?

时间:2016-02-10 18:08:53

标签: c# automapper

随着AutoMapper 4.2的发布,静态映射器接口已经过时,新推荐的方法是使用DI / IoC在需要的地方注入映射器。

我正在努力将我的项目升级到此版本,并且我已将配置移动到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);

要添加一些上下文,FavoritesComboItemModelFavoritesGroupModel都会从FavoritesNode继承,而ProjectEntity会有ProjectTaskEntity的列表。这些映射用于使相当简单的Project结构适应收藏夹模型用于的完全动态树结构。

所以鉴于这种配置,我仍然可以在新实例api中进行这些地图调用吗?

* IgnoreMemberMapMember是我自己对相应ForMember变体的快捷方式扩展。

2 个答案:

答案 0 :(得分:2)

是的,这很容易。

对于ConstructUsing方法,您有一个重载,它接收带有ResolutionContext参数的Func。分辨率上下文具有Engine属性,该属性包含对当前正在进行映射的映射引擎的引用。

它看起来像这样:

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

还有ResolveUsing重载,它接收映射上下文。

答案 1 :(得分: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);