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

问题描述 投票:0回答:3

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

  1. 使用此问题中的解决方案(Automapper 1.0)

  2. 创建自定义值解析器

  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);
        }
    }
c# automapper automapper-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
投票

我最终为来自

MainObject
DTOObject
的任何子对象创建了自己的值解析器。

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

然后在我的 Automapper 配置中创建从

DTOObject
SubObject
的映射,并使用 ValueResolver 将该对象映射到
MainObject

Mapper.CreateMap<DTOObject, SubObject>();

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

1
投票

ResolveUsing 不适用于最新版本的 AutoMapper。所以剩下的唯一选择就是使用 MapFrom。 (使用@ZedRoth解决方案)。

© www.soinside.com 2019 - 2024. All rights reserved.