Как отобразить несколько источников в один элемент назначения - PullRequest
0 голосов
/ 03 апреля 2019

Я пытаюсь отобразить несколько источников разных типов в одно место назначения с помощью AutoMapper, но место назначения перезаписывается независимо от того, какое последнее свойство было отображено (Wire в моем примере ниже). Как я могу добавить в список адресатов вместо перезаписи? Вот как я сейчас зарегистрировал свои отображения:

CreateMap<SourceBE, Destination()
   .ForMember(e => e.Payments, c => c.MapFrom(src => src.Checks))
   .ForMember(e => e.Payments, c => c.MapFrom(src => src.Wires))
   ;

CreateMap<CheckBE, Destination>()
   .ForMember(e => e.Id, c => c.MapFrom(src => src.Id))
   .ForMember(e => e.Amount, c => c.MapFrom(src => src.Amount))
   .ForMember(e => e.Type, c => c.MapFrom(src => PaymentType.Check))
   ;

CreateMap<WireBE, Destination>()
   .ForMember(e => e.Id, c => c.MapFrom(src => src.Id))
   .ForMember(e => e.Amount, c => c.MapFrom(src => src.Amount))
   .ForMember(e => e.Type, c => c.MapFrom(src => PaymentType.Wire))
   ;

Я мог бы ввести базовый тип, который разделяют все платежи, и затем объединить списки, есть ли другой способ просто добавить в список адресатов?

1 Ответ

0 голосов
/ 05 апреля 2019

Я решил проблему с помощью AfterMap ().

.AfterMap((src, dest, ctx) =>
{
   var checks = ctx.Mapper.Map<IList<Destination>>(src.Checks);
   var wires = ctx.Mapper.Map<IList<Destination>>(src.Wires);
   dest.Payments = checks.Concat(wires).ToList();
});

Единственный недостаток, который я обнаружил при таком подходе, заключается в том, что вы больше не можете использовать ProjectTo <> (), поскольку он не поддерживает AfterMap().

Итак, вместо этого:

.ProjectTo<Destination>()

Просто сделайте это:

Mapper.Map<Destination>(sourceBE)

Как уже упоминалось Lucian AutoMapper.Collection может быть альтернативным подходом.Изучив документы, я не понял, как это поможет моей проблеме, и даже если бы это было так, как было бы лучше, чем использование AfterMap.

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