2013-08-07 3 views
18

Это мои классы:Можно использовать 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 обрабатывать его для меня.

ответ

22

Вам понадобятся эти три mapings с один пользовательский преобразователь:

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); 
+3

Ты легенда, приятель! Огромное спасибо! * happy * – noocyte

+0

Надеюсь, это будет спасительной грацией моих проблем, когда я получу работу завтра – Stu1986C

+0

Как сделать foreach без использования глобального вызова Mapper.Map? У меня разные экземпляры двигателей. – Beachwalker

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