Automapper将一个对象映射到嵌套对象

9
自动映射器 2.0 中映射内部对象的最佳方法是什么?
  1. Use the solution in this question (Automapper 1.0)

  2. Create a Custom Value Resolvers

  3. ?

    public class DTOObject
    {
        // MainObject
        public int Id { get; set; }
        public string Name { get; set; }
    
        // SubObject (TopObject)
        public string TopText { get; set; }
        public string TopFont { get; set; }
    
        // SubObject (BottomObject)
        public string BottomText { get; set; }
        public string BottomFont { get; set; }
    }
    
    public class MainObject
    {
        public int Id { get; set; }
        public string Name { get; set; }
    
        public SubObject TopObject { get; set; }
        public SubObject BottomObject { get; set; }
    }
    
    public class SubObject
    {
        public string SubPropText { get; set; }
        public string SubPropFont { get; set; }
    }
    
自定义值解析器
    public class CustomResolver : ValueResolver<DTOObject, SubObject>
    {
        protected override SubObject ResolveCore(DTOObject source)
        {
            return Mapper.Map<DTOObject, SubObject>(source);
        }
    }

你对DTOObject的设计有控制权吗? - sean woodward
是的,这是一个被广泛使用的旧数据库,也不是。 - Bjarki Heiðar
4
最好使用 Mapper.CreateMap<DTOObject, MainObject>().ForMember(d => d.TopObject, mc => mc.MapFrom(s => new SubObject(){ SubPropText = s.TopText, SubPropFont = s.TopFont } )); - sean woodward
另外请注意,在您的CustomResolver中,不应调用Mapper.Map(),而应使用源中的属性创建SubObject并返回它。 - sean woodward
为什么不调用一个映射子函数,该函数接收相同的源对象,并返回我所需的子对象呢? - Bjarki Heiðar
显示剩余2条评论
3个回答

13
对我来说,只需使用MapFrom就可以了(而不需要使用ResolveUsing),这样你就有机会在IQueryable扩展中使用这个映射。因此,在Automapper配置中,你将得到以下内容:
Mapper.CreateMap<DTOObject, SubObject>()
    .ForMember(dest => dest.SubPropText, opt => opt.MapFrom(x => x.BottomText))
    .ForMember(dest => dest.SubPropFont, opt => opt.MapFrom(x => x.BottomFont));

Mapper.CreateMap<DTOObject, MainObject>()
    .ForMember(dest => dest.TopPart, opt => opt.MapFrom(x => x))
    .ForMember(dest => dest.BottomPart, opt => opt.MapFrom(x => x));

3
我最终为来自DTOObject的MainObject的任何SubObjects创建了自己的值解析器。
public class PartResolver<T> : ValueResolver<DTOObject, T>
{
    protected override T ResolveCore(DTOObject source)
    {
        return Mapper.Map<T>(source);
    }
}

然后在我的Automapper配置中,我创建了一个从DTOObjectSubObject的映射,并使用ValueResolver将该对象映射到MainObject中。

Mapper.CreateMap<DTOObject, SubObject>();

Mapper.CreateMap<DTOObject, MainObject>()
    .ForMember(dest => dest.SubPart, opt => opt.ResolveUsing<PartResolver<SubObject>>());

1

ResolveUsing在最新版本的AutoMapper中不可用。因此,唯一的选择是使用MapFrom(使用@ZedRoth解决方案)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接