Как использовать действие BeforeMap при сопоставлении двух коллекций с Automapper? - PullRequest
1 голос
/ 24 апреля 2019

При отображении двух отдельных объектов с помощью автоматического средства действие BeforeMap работает нормально:

return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
    opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});

Но при отображении двух коллекций BeforeMap не работает, поскольку src и dest имеют тип object сейчас:

return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
    opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});

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

Ответы [ 2 ]

1 голос
/ 25 апреля 2019

Я предварительно решил это так:

        var result = new List<ProjectDto>();
        foreach (var item in projects)
        {
            var dest = new ProjectDto() { ProvidedLanguage = requestedLanguage };
            result.Add(_mapper.Map(item, dest));
        }

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

0 голосов
/ 25 апреля 2019

Использование BeforeMap() для настройки пункта назначения объект опасен. Выполнение вашего кода:

return _mapper.Map<Project, ProjectDto>(projects, opt =>
{
    opt.BeforeMap((src, dest) => dest.ProvidedLanguage = requestedLanguage);
});

приведет к NullReferenceException, так как объект dest еще не был инициализирован AutoMapper. Смотрите, BeforeMap() лучше всего работает при выполнении некоторых настроек над исходным объектом, потому что любая работа над целевым объектом может быть переопределена предстоящим процессом отображения. Если вы хотите настроить объект destination , лучше использовать AfterMap(). Таким образом, у вас уже будет закончен процесс отображения, и вы будете уверены, что ваш целевой объект был инициализирован. Я не говорю, что вы не должны использовать BeforeMap(), я просто говорю, что будьте осторожны с этим и используйте его, когда вы действительно знаете, что делаете.

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

И вы не сможете установить ProvidedLanguage свойство на IEnumerable. Если вы хотите установить это свойство для каждого ProjectDto, который находится внутри этого IEnumerable, используйте для этого цикл foreach:

return _mapper.Map<IEnumerable<Project>, IEnumerable<ProjectDto>>(projects, opt =>
{
    opt.AfterMap((source, destination) =>
    {
        foreach (var dto in destination)
        {
            dto.ProvidedLanguage = requestedLanguage;
        }
    });
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...