Карта Automapper от одного объекта до вложенных объектов
Каков наилучший способ для отображения внутренних объектов с Automapper 2.0
Используйте решение в этом вопросе (Automapper 1.0)
Создание пользовательских резолверов значений
?
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).