随着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);
要添加一些上下文,FavoritesComboItemModel
和FavoritesGroupModel
都会从FavoritesNode
继承,而ProjectEntity
会有ProjectTaskEntity
的列表。这些映射用于使相当简单的Project结构适应收藏夹模型用于的完全动态树结构。
所以鉴于这种配置,我仍然可以在新实例api中进行这些地图调用吗?
* IgnoreMember
和MapMember
是我自己对相应ForMember变体的快捷方式扩展。
答案 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);