Automapper: передача параметра в метод Map
Я использую Automapper в моем проекте, и мне нужно динамически оценивать поле моего объекта назначения.
В моей конфигурации у меня есть нечто похожее:
cfg.CreateMap<Message, MessageDto>()
// ...
.ForMember(dest => dest.Timestamp, opt => opt.MapFrom(src => src.SentTime.AddMinutes(someValue)))
//...
;
someValue
в коде конфигурации - это параметр, который мне нужно передать во время выполнения в mapper и не является полем исходного объекта.
Есть ли способ достичь этого? Что-то вроде этого:
Mapper.Map<MessageDto>(msg, someValue));
Ответы
Ответ 1
Вы не можете сделать именно то, что хотите, но вы можете приблизиться, указав параметры отображения при вызове карты. Игнорируйте свойство в вашей конфигурации:
cfg.CreateMap<Message, MessageDto>()
.ForMember(dest => dest.Timestamp, opt => opt.Ignore())
;
Затем передайте параметры при вызове вашей карты:
int someValue = 5;
var dto = Mapper.Map<Message, MessageDto>(message, opt =>
opt.AfterMap((src, dest) => dest.TimeStamp = src.SendTime.AddMinutes(someValue)));
Обратите внимание, что для использования этого синтаксиса вам необходимо использовать перегрузку Mapper.Map<TSrc, TDest>
.
Ответ 2
Другим возможным вариантом при использовании метода Map будет использование словаря Items. Пример:
int someValue = 5;
var dto = Mapper.Map<Message>(message,
opts => opts.Items["Timestamp"] = message.SentTime.AddMinutes(someValue));
Это немного меньше кода и имеет преимущество динамически заданных полей.