web-dev-qa-db-fra.com

Est-il possible d'utiliser AutoMapper pour mapper un objet à une liste d'objets?

Ce sont mes cours:

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; }
}

Fondamentalement, je dois passer d'un seul objet, avec une liste imbriquée, à une liste d'objets avec des valeurs de la liste imbriquée et de l'objet parent. Cela peut-il être fait dans AutoMapper? Je me rends compte que je peux facilement mapper la liste d'événements et obtenir une liste d'objets EventDTO, puis définir manuellement les SystemId et UserId, il serait juste très pratique de laisser AutoMapper le gérer pour moi.

28
noocyte

Vous aurez besoin de ces trois mappages avec un convertisseur personnalisé:

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

Ainsi, vous avez configuré les mappages de Event à EventDTO et de EventLog à EventDTO, vous pouvez utiliser les deux dans le convertisseur personnalisé:

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;
        }
    }
}

Exemple de code avec NBuilder :

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

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