Динамически игнорировать свойства во время сопоставления с использованием AutoMapper

#c# #.net-core #automapper

#c# #.net-core #automapper

Вопрос:

Я использую AutoMapper в своем приложении на .net-ядре для создания DTO из моих объектов Nhibernate для отправки клиенту в виде JSON. Однако есть некоторые запросы, по которым мне нужно опустить определенные свойства в моей сущности. Например, предположим, что у меня есть следующие классы:

 public class Person
{
    public ICollection<Friend> Friends { get; set; }
}

public class PersonDTO
{
    public ICollection<FriendDTO> Friends { get; set; }
}
  

Бывают случаи, когда мне нужно отправить клиенту пользователя со всеми его друзьями, однако иногда мне просто нужен этот человек. У меня есть конфигурация automapper, которая определяет простое сопоставление между Person и PersonDTO без пропущенных свойств, потому что это наиболее распространенный случай. Однако, вместо того, чтобы создавать два отдельных DTO (одно с отображенным свойством Friends, а другое с игнорируемым им), было бы неплохо каким-то образом указать это во время сопоставления. Я пробовал следующее, но, похоже, это не работает:

 var personDtoWithoutFriends = _mapper.map<Person, PersonDTO>(person,
    opts => opts.ConfigureMap()
        .ForMember(dest => dest.Friends, act => act.Ignore()))
  

Я знаю, что могу решить эту проблему с помощью нескольких DTO, однако это чрезвычайно распространенный шаблон в моем приложении, и в конечном итоге я бы создал большое количество DTO. Игнорирование определенных свойств в тех немногих случаях, когда мне нужно, кажется гораздо более элегантным решением. Я делаю что-то неправильно или это просто невозможно с помощью AutoMapper?

Комментарии:

1. Я не уверен, сработает ли это для вас, но как насчет создания двух разных картографов, одного для сопоставления с друзьями и одного для сопоставления без и переключения между ними, когда это необходимо?

2. docs.automapper.org/en/latest/Conditional-mapping.html