Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Как правильно реализовать маппинг generic классов, и возможна ли при этом передача параметров?

Всем добрый вечер. У меня старый проект, в котором не было automapper'a. Сейчас я добавляю его.
Ранее, за маппинг отвечал следующий класс и метод:
internal static class PaginatedListExtensions {
internal static PaginatedDto ToPaginatedDto( this PaginatedList source, IEnumerable items) where TDto : IDto {
return new PaginatedDto { Items = items, PageIndex = source.PageIndex, PageSize = source.PageSize, //others }; } }
Собственно при маппинге можно было просто передать параметр IEnumerable items. Пример использования в старой версии:
return affiliates.ToPaginatedDto( affiliates.Select(af => af.ToAffiliateDto()));
Однако теперь я пытаюсь использовать automapper. Вот моя регистрация:
Mapper.CreateMap(typeof(PaginatedList<>), typeof(PaginatedDTO<>)) .ConvertUsing(typeof(PaginatedListDTOConverter<>));
Вот мой конвертер
public class PaginatedListDTOConverter : ITypeConverter, PaginatedDTO> where T : IDTO { public PaginatedDTO Convert(ResolutionContext context) { var paginatedList = (PaginatedList)context.SourceValue;
return new PaginatedDTO { //Items = items ////items - хочется передать параметром
PageIndex = paginatedList.PageIndex, PageSize = paginatedList.PageSize,
//Others }; } }
Стандартное использование, которое фактически не работает без передачи внешнего параметра IEnumerable items
var dest = Mapper.Map, PaginatedDTO

>(source);
Первая часть вопроса в том, нормальна ли такая реализация маппинга generic классов?
А вторая часть - самая главная, как возможно передать при маппинге параметр IEnumerable items, как в старой версии, и использовать его в конвертере например, передав в поле Items класса PaginatedDTO ?


Ответ

У меня в свое время была та же задача, в итоге решил использовать параметризированные обертки (самописные, по сути упрощенные ваши старые маппинги) над AutoMapper'ом. Потому что штатный способ выглядит неочень:
public class PaginatedListDTOConverter : ITypeConverter, PaginatedDTO> where T : IDTO { public PaginatedDTO Convert(ResolutionContext context) { return new PaginatedDTO { Items = context.Options.Items["items"]; // ... }; } }'
var dest = Mapper.Map, PaginatedDTO

>( source, opt => opt.Items["items"] = affiliates.Select(af => af.ToAffiliateDto()));

Комментариев нет:

Отправить комментарий