【问题标题】:Automapper map from one object to nested objectsAutomapper 从一个对象映射到嵌套对象
【发布时间】:2012-02-25 00:26:04
【问题描述】:

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

  1. 使用这个question(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);
        }
    }

【问题讨论】:

  • 您是否可以控制 DTOObject 的设计?
  • 是的,不,这是一个使用量很大的旧数据库。
  • 你想往哪个方向走,DTOObject 到 MainObject 还是 MainObject 到 DTOObject?
  • 可能最好使用Mapper.CreateMap&lt;DTOObject, MainObject&gt;().ForMember(d =&gt; d.TopObject, mc =&gt; mc.MapFrom(s =&gt; new SubObject(){ SubPropText = s.TopText, SubPropFont = s.TopFont } ));
  • 另外请注意,在您的 CustomResolver 中您不应该调用 Mapper.Map() 您应该使用源中的属性创建子对象并返回它。

标签: c# automapper automapper-2


【解决方案1】:

对我来说,可以只使用 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.SubPart, opt => opt.MapFrom(x => x));

【讨论】:

    【解决方案2】:

    我最终为来自DTOObjectMainObject 的任何子对象创建了自己的值解析器。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2017-07-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-06
        • 2020-04-03
        • 2019-04-26
        • 1970-01-01
        • 2017-06-11
        相关资源
        最近更新 更多