C# 自动映射从一个对象到嵌套对象

C# 自动映射从一个对象到嵌套对象,c#,automapper,automapper-2,C#,Automapper,Automapper 2,使用Automapper 2.0映射内部对象的最佳方式是什么 使用此(Automapper 1.0)中的解决方案 创建自定义值解析程序 public class CustomResolver : ValueResolver<DTOObject, SubObject> { protected override SubObject ResolveCore(DTOObject source) { return Mapp

使用Automapper 2.0映射内部对象的最佳方式是什么

  • 使用此(Automapper 1.0)中的解决方案

  • 创建自定义值解析程序

  •     public class CustomResolver : ValueResolver<DTOObject, SubObject>
        {
            protected override SubObject ResolveCore(DTOObject source)
            {
                return Mapper.Map<DTOObject, SubObject>(source);
            }
        }
    
  • ?

  • 自定义值解析程序

        public class CustomResolver : ValueResolver<DTOObject, SubObject>
        {
            protected override SubObject ResolveCore(DTOObject source)
            {
                return Mapper.Map<DTOObject, SubObject>(source);
            }
        }
    
    公共类CustomResolver:ValueResolver
    {
    受保护的覆盖子对象ResolveCore(DTOOObject源)
    {
    返回Mapper.Map(源);
    }
    }
    
    我最终为来自
    DTOObject
    main object
    的任何子对象创建了自己的值解析器

    public class PartResolver<T> : ValueResolver<DTOObject, T>
    {
        protected override T ResolveCore(DTOObject source)
        {
            return Mapper.Map<T>(source);
        }
    }
    

    对我来说,只使用MapFrom是可能的(而不必使用什么使您有机会将此映射与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.SubPart, opt => opt.MapFrom(x => x));
    
    Mapper.CreateMap()
    .FormMember(dest=>dest.subspText,opt=>opt.MapFrom(x=>x.BottomText))
    .ForMember(dest=>dest.subspfont,opt=>opt.MapFrom(x=>x.BottomFont));
    Mapper.CreateMap()
    .FormMember(目标=>目标子部分,选项=>选项映射自(x=>x));
    
    最新版本的AutoMapper不提供ResolveUsing。因此,剩下的唯一选项是使用MapFrom。(使用@ZedRoth解决方案)。

    您可以控制DTOObject的设计吗?可以,也可以。这是一个使用量很大的旧数据库。DTOObject到MainObject还是MainObject到DTOObject?最好使用
    Mapper.CreateMap().FormMember(d=>d.TopObject,mc=>mc.MapFrom(s=>new SubObject()){subspText=s.TopText,subspfont=s.TopFont}));
    还要注意,在CustomResolver中不应该调用Mapper.Map(),应该使用源中的属性创建子对象并返回该子对象。
    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.SubPart, opt => opt.MapFrom(x => x));