是否仍有可能调用 mapper.map 的地图?

Is it still possible to have maps that make a call to mapper.map?

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

我正在努力将我的项目升级到这个版本,我已经将我的配置移动到 Profile class 的实现中。我遇到的问题是我的一些地图依赖于能够进行额外的 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 都继承自 FavoritesNodeProjectEntity 有一个 ProjectTaskEntity 列表。这些映射用于将相当简单的项目结构调整为收藏夹模型所使用的完全动态的树结构。

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

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

虽然不是问题的直接答案,但可以使用 IMappingExpression

上的 As<T> 方法实现相同的目标

以下是实施此问题的示例:

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);

是的,这很容易。

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

看起来像这样:

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

还有一个接收映射上下文的 ResolveUsing 重载。