AutoMapper и отображения вложенных объектов для инкапсуляции - PullRequest
0 голосов
/ 09 ноября 2018

Я не слишком знаком с autopper, но наш Архитектор программного обеспечения наложил на меня этот проект.

Концепция полной инкапсуляции волатильности. Вот плохо сделанная диаграмма

API / Уровень представления | Объекты суффикса запроса и ответа. (т.е. ApplicationCreateRequest)


Бизнес-уровень | Домен Передачи объектов, с суффиксом DTO. (т. е. ApplicationCreateDTO)


Уровень базы данных | Дом доступа к ресурсам Объекты и сущности с суффиксами RAO и Entity (т. Е. ApplicationEntity, ApplicationCreateRAO)

Мне нужно преобразовать ApplicationCreateRequests в ApplicationCreateDTO, а также преобразовать вложенные объекты Requests в DTO.

Например:

public class ApplicationCreateRequest
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ContactCreateRequest Contact { get; set; }
    public DemographicCreateRequest Demographic { get; set; }
    public EducationCreateRequest Education { get; set; }
    public WorkCreateRequest Work { get; set; }
}

становится

public class ApplicationCreateDTO
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ContactCreateDTO Contact { get; set; }
    public DemographicCreateDTO Demographic { get; set; }
    public EducationCreateDTO Education { get; set; }
    public WorkCreateDTO Work { get; set; }
}

DTO и запросы имеют по большей части одинаковые свойства.

Мне довелось работать только с такими базовыми сопоставлениями, как:

CreateMap<ObjectOne, ObjectTwo>(); 

1 Ответ

0 голосов
/ 10 ноября 2018

Простой способ отобразить сложную модель - это объявить и отобразить их от самых простых (с нативными типами, например: strings, int, ...) до сложных.

Итак, вы должны создать простые сопоставления для ContactCreateRequest с ContactCreateDTO с помощью CreateMap (и других самых простых). Тогда вам нужно будет создать что-то вроде:

MapFrom позволяет вам указывать свойство (причину, если имя по-другому) для сопоставления. Это также позволяет вам указать результат из предопределенного отображения, вы просто сообщаете ему, из какого элемента вы хотите отобразить ...

Mapper.CreateMap<ApplicationCreateRequest, ApplicationCreateDTO>()
    .ForMember(g => g.FirstName, opt => opt.MapFrom(src => src.FirstName));
    .ForMember(g => g.LastName, opt => opt.MapFrom(src => src.LastName));
    .ForMember(g => g.Contact, opt => opt.MapFrom(src => Mapper.Map<ContactCreateRequest,ContactCreateDTO>(g.Contact)));
    .ForMember(g => g.Demographic, opt => opt.MapFrom(src => Mapper.Map<DemographicCreateRequest,DemographicCreateDTO>(g.Demographic)));
    .ForMember(g => g.Education, opt => opt.MapFrom(src => Mapper.Map<EducationCreateRequest,EducationCreateDTO>(g.Education)));
    .ForMember(g => g.Work, opt => opt.MapFrom(src => Mapper.Map<WorkCreateRequest,WorkCreateDTO>(g.Work)));

Вы можете создать с помощью

.ForMember (g => g.Property, opt => opt.Ignore ()); // игнорировать отображение свойства

Полезное примечание, определите базовое отображение перед сложными, иначе у вас будут проблемы!

Надеюсь, это поможет.

...