Как использовать autopper с convertusing и условием? - PullRequest
2 голосов
/ 09 апреля 2020

Мы используем ядро ​​automapper. net ядро, чтобы отобразить модели представления в dtos. Для datetime мы хотели бы сохранить ut c в нашей базе данных, но для пользователя мы хотели бы отобразить местный часовой пояс. Это хорошо сочетается с ConvertUsing следующим образом:

CreateMap<CreateAgendaItemViewModel, AgendaItemDto>()
.ForMember(dest => dest.StartDateTime, opt => opt.ConvertUsing(new ToUtcTimeConverter()))
.ReverseMap()
.ForMember(dest => dest.StartDateTime, opt => opt.ConvertUsing(new ToLocalTimeConverter()))

Пока все хорошо, если вы всегда хотите изменить время. Однако возможно, что установлена ​​только дата, а не время (потому что это событие на весь день), и мы хотели бы сохранить время следующим образом: 2020-04-09 00: 00: 00.0000000. У нас есть логическое значение в моделях, которое указывает, действительно ли это событие на весь день или нет. Как мы можем обусловить конвертирование?

Мы уже пробовали MapFrom с условием, но оно не может иметь конвертирование. Мы также попробовали это, но в итоге это не было отображено или отображено на время c.

.ForMember(dest => dest.StartDateTime, opt => { opt.Condition(src => !src.AllDayEvent); opt.ConvertUsing(new ToUtcTimeConverter()); })

1 Ответ

0 голосов
/ 14 апреля 2020

Спасибо за возможные решения в комментариях. Я попробовал пользовательский valueconvert, однако в итоге у меня появилось много классов для каждого типа преобразования, в то время как у нас есть несколько источников и мест назначения, которые запрашивают одно и то же решение. Это не то, что я хотел. Но я также обнаружил, что convertUsing с условием не был подходом к go для этой проблемы. Вот как я решил проверку и сопоставление:

 CreateMap<AgendaItemViewModel, AgendaItemDto>()
.ForMember(dest => dest.StartDateTime, opt => opt.MapFrom(src => src.AllDayEvent ? src.StartDateTime : src.StartDateTime.ToUniversalTime()))
.ReverseMap()
.ForMember(dest => dest.StartDateTime, opt => opt.MapFrom(src => src.AllDayEvent ? src.StartDateTime : src.StartDateTime.ToLocalTimeZoneTime()))

Итак, ToUniversalTimeZone является расширением DateTime, и я создал наше собственное расширение ToLocalTimeZoneTime.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...