2015-12-21 14 views
12

Sto utilizzando Automapper nel mio progetto e ho bisogno di valorizzare un campo dell'oggetto di destinazione in modo dinamico.Automapper: passare il parametro al metodo Map

Nella mia configurazione ho qualcosa simile:

cfg.CreateMap<Message, MessageDto>() 
    // ... 
    .ForMember(dest => dest.Timestamp, opt => opt.MapFrom(src => src.SentTime.AddMinutes(someValue))) 
    //... 
    ; 

Il someValue nel codice di configurazione è un parametro che ho bisogno di passare alla fase di esecuzione per il mapper e non è un campo dell'oggetto sorgente.

C'è un modo per raggiungere questo obiettivo? Qualcosa di simile a questo:

Mapper.Map<MessageDto>(msg, someValue)); 
+0

Questo potrebbe aiutare: https://stackoverflow.com/questions/31748671/pass-objects-to-automapper-mapping –

+0

I voti migliori per l'uso corretto di valorizzare. – TheDude

risposta

23

Non si può fare esattamente quello che vuoi, ma è possibile ottenere abbastanza vicino specificando le opzioni di mapping quando si chiama Map. Ignora la proprietà nella vostra configurazione:

cfg.CreateMap<Message, MessageDto>() 
    .ForMember(dest => dest.Timestamp, opt => opt.Ignore()) 
    ; 

poi passano nelle opzioni quando si chiama la tua mappa:

int someValue = 5; 
var dto = Mapper.Map<Message, MessageDto>(message, opt => 
    opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue))); 

Si noti che è necessario utilizzare il Mapper.Map<TSrc, TDest> overload di utilizzare questa sintassi.

+0

Perfetto, questo è esattamente ciò di cui ho bisogno! Grazie! – davioooh

+4

non sarebbe più facile in questo caso, invece di AfterMap, assegna semplicemente dto.TimeStamp = message.SendTime.AddMinutes (someValue); –

+0

Questa soluzione funziona solo per mappature piatte come se si mappasse un albero di oggetti che non è possibile gestire manualmente in questo modo ... insieme al fatto che il codice "opt.AfterMap" si moltiplica per il tempo di mappatura dell'oggetto nel progetto e è più difficile da gestire e risolvere in un'unica posizione, a meno che non incapsuli l'intera funzione della mappa. –

2

Un'altra possibile opzione durante l'utilizzo del metodo Mappa è l'utilizzo del dizionario degli elementi. Esempio:

int someValue = 5; 
var dto = Mapper.Map<Message>(message, 
    opts => opts.Items["Timestamp"] = message.SentTime.AddMinutes(someValue)); 

È un po 'meno codice e presenta il vantaggio di campi specificati in modo dinamico.