Подтвердить что ты не робот

Можно использовать AutoMapper для отображения одного объекта в список объектов?

Это мои классы:

public class EventLog {
        public string SystemId { get; set; }
        public string UserId { get; set; }
        public List<Event> Events { get; set; }
}

public class Event {
        public string EventId { get; set; }
        public string Message { get; set; }
}

public class EventDTO {
        public string SystemId { get; set; }
        public string UserId { get; set; }
        public string EventId { get; set; }
        public string Message { get; set; }
}

В основном мне нужно перейти от одного объекта с вложенным списком к списку объектов со значениями из вложенного списка и родительского объекта. Это можно сделать в AutoMapper? Я понимаю, что я могу легко сопоставить список событий и получить список объектов EventDTO, а затем вручную установить SystemId и UserId, было бы очень удобно позволить AutoMapper обрабатывать его для меня.

4b9b3361

Ответ 1

Вам понадобятся эти три карты с одним настраиваемым конвертером:

Mapper.CreateMap<Event, EventDTO>(); // maps message and event id
Mapper.CreateMap<EventLog, EventDTO>(); // maps system id and user id
Mapper.CreateMap<EventLog, IEnumerable<EventDTO>>()
      .ConvertUsing<EventLogConverter>(); // creates collection of dto

Таким образом, вы настроили сопоставление от Event до EventDTO и от EventLog до EventDTO, вы можете использовать оба из них в пользовательском конвертере:

class EventLogConverter : ITypeConverter<EventLog, IEnumerable<EventDTO>>
{
    public IEnumerable<EventDTO> Convert(ResolutionContext context)
    {
        EventLog log = (EventLog)context.SourceValue;
        foreach (var dto in log.Events.Select(e => Mapper.Map<EventDTO>(e)))
        {
            Mapper.Map(log, dto); // map system id and user id
            yield return dto;
        }
    }
}

Пример кода с NBuilder:

var log = new EventLog {
    SystemId = "Skynet",
    UserId = "Lazy",
    Events = Builder<Event>.CreateListOfSize(5).Build().ToList()
};

var events = Mapper.Map<IEnumerable<EventDTO>>(log);