AutoMapper ограничивает глубину отображения или карты лениво - PullRequest
4 голосов
/ 10 августа 2010

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

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

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

Ответы [ 3 ]

5 голосов
/ 11 августа 2010

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

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 голосов
/ 21 ноября 2018

Я использую предварительные условия для предотвращения сопоставления данных.

CreateMap<Team, TeamDto>()
    .ForMember(dto => dto.Users, options =>
    {
        options.PreCondition(ctx => !ctx.Items.ContainsKey(AutoMapperItemKeys.SKIP_TEAM_USERS));
        options.MapFrom(t => t.TeamUsers.Where(tu => tu.IsDeleted == false));
    })
    .ReverseMap();

Когда вызывается Map (), я заполняю словарь Предметов пропускающими ключами для свойств, которые я не хочу отображать.

this.mapper.Map<IEnumerable<Team>, IEnumerable<TeamDto>>(teams, opts =>
{
    opts.Items.Add(AutoMapperItemKeys.SKIP_TEAM_USERS, true);
});

Преимущества:

  • вы можете детализировать, какие свойства не отображать
  • предотвращает отображение на глубину с вложенными объектами
  • нет необходимости дублировать dto
  • нет дублировать профили отображения
0 голосов
/ 10 августа 2010

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

...