web-dev-qa-db-fra.com

Automapper: passage de paramètre à la méthode Map

J'utilise Automapper dans un projet et j'ai besoin de valoriser dynamiquement un champ de mon objet de destination.

Dans ma configuration, j'ai quelque chose de similaire:

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

Le someValue dans le code de configuration est un paramètre que je dois transmettre au moment de l'exécution au mappeur et n'est pas un champ de l'objet source.

Existe-t-il un moyen d'y parvenir? Quelque chose comme ça:

Mapper.Map<MessageDto>(msg, someValue));
28
davioooh

Vous ne pouvez pas faire exactement ce que vous voulez, mais vous pouvez vous rapprocher en spécifiant les options de mappage lorsque vous appelez Map. Ignorez la propriété dans votre configuration:

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

Passez ensuite des options lorsque vous appelez votre carte:

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

Notez que vous devez utiliser le Mapper.Map<TSrc, TDest> surcharge pour utiliser cette syntaxe.

46
Richard

Une autre option possible lors de l'utilisation de la méthode Map serait l'utilisation du dictionnaire Items. Exemple:

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

C'est un peu moins de code et a l'avantage de champs spécifiés dynamiquement.

8
Sven