Карта Automapper от одного объекта до вложенных объектов

Каков наилучший способ для отображения внутренних объектов с 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);
        }
    }

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.SubPart, opt => opt.ResolveUsing<PartResolver<SubObject>>());

Для меня было возможно использовать только 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));

ResolveUsing недоступен в последней версии AutoMapper. Так что остается только один вариант — использовать MapFrom. (используйте решение @ZedRoth).

Другие вопросы по тегам