2010-08-10 2 views
4

AutoMapper замечательный, экономит много времени, но когда я начал смотреть на производительность своего приложения, AutoMapper несет ответственность за потерю производительности.AutoMapper предельная глубина отображения или карты лениво

Я использую ленивую загрузку с помощью NHibernate. Большую часть времени требуется родительский объект без необходимости доступа к дочерним объектам вообще. На самом деле происходит то, что AutoMapper пытается сопоставить как можно больше отношений, заставляя NHibernate ленить загружать все дочерние сущности (я все время вижу SELECT N + 1).

Есть ли способ ограничить, насколько глубокий AutoMapper идет или это возможно для AutoMapper для лэйзирования дочерних объектов?

+0

У меня такая же проблема. Хороший вопрос, есть много настроек для AutoMapper, поэтому потребуется настройка. – zidane

ответ

5

Вы можете использовать метод игнорирования для ассоциаций, которые вам не нужно загружать.

Mapper.CreateMap<User, UserDto>() 
    .ForMember(dest => dest.LazyCollection, opt => opt.Ignore()) 
    .ForMember(dest => dest.AnotherLazyCollection, opt => opt.Ignore()) 
Mapper.CreateMap<UserProperty, UserPropertyDto>() 
    .ForMember(dest => dest.PropertyLazyReference, opt => opt.Ignore()); 
return Mapper.Map<User, UserDto>(user); 

Для ассоциаций вы знаете, вы будете нуждаться в вашем DTO, вы должны искать пути более эффективного извлечения их с первоначальным запросом, но это совершенно новая проблема.

+0

Я закончил использовать пользовательские резольверы, спасибо за ваше предложение –

+0

Недавняя версия AutoMapper v2 имеет ограничитель .MaxDepth (int), но я не уверен, что это только для рекурсивных структур объектов или может применяться только к глубоким структурам. –

0

Возможно, вам стоит рассмотреть возможность использования двух разных dtos; один, который включает дочерние сущности, и тот, который этого не делает. Затем вы можете вернуть надлежащее dto со своего уровня обслуживания в зависимости от контекста.

Смежные вопросы