AutoMapper передает родительскую ссылку при сопоставлении дочернего объекта

Я пытаюсь использовать AutoMapper для отображения некоторых объектов DTO (контрактов данных), полученных от веб-службы, в мои бизнес-объекты. Корневой объект DTO содержит набор дочерних объектов. У моего бизнес-объекта также есть дочерняя коллекция дочерних бизнес-объектов. Чтобы заставить AutoMapper работать, мне пришлось включить сеттер в свойство коллекции в моем бизнес-объекте, иначе коллекция всегда будет пустой. Вдобавок мне пришлось добавить к типу коллекции конструктор по умолчанию. Итак, мне кажется, что AutoMapper создает экземпляр нового объекта коллекции, заполняет его и устанавливает в качестве свойства коллекции моего бизнес-объекта.

Хотя это все хорошо, у меня есть дополнительная логика, которая должна быть подключена, когда коллекция создается, и наличие конструктора по умолчанию лишает ее цели. По сути, я устанавливаю отношения между родителями и детьми и связываю некоторые события так, чтобы они передавались от ребенка к родителю.

Я бы хотел, чтобы AutoMapper просто отображал дочерние объекты из коллекции DTO в существующую коллекцию на моем BO. Другими словами, пропустите создание новой коллекции и просто используйте ту, которая уже есть в бизнес-объекте.

Есть ли способ легко сделать это?!?!?

UPDATE

Возможно, лучший вопрос и проще решение моей проблемы: можно ли определить аргументы, которые AutoMapper будет передавать коллекции при создании экземпляра? Моя дочерняя коллекция определяется следующим образом:

public class ChildCollection : Collection<ChildObjects>
{
    public ChildCollection(ParentObject parent) { Parent = parent; }
}

Если я могу настроить AutoMapper на использование этого конструктора и передать нужный объект, это будет ИДЕАЛЬНО!

ДРУГОЕ ОБНОВЛЕНИЕ

Для ясности, вот другие классы в проблемном пространстве:

public class ParentObject
{
    private ChildCollection _children;

    public ChildCollection Children
    {
        get
        {
            if (_children == null) _children = new ChildCollection(this);

            return _children;
        }
    }
}

public class ParentDTO
{
    public ICollection<ChildDTO> Children { get; set; }
}

public class ChildDTO
{
    public String SomeProperty { get; set; }
}

Я настраиваю AutoMapper следующим образом:

Mapper.CreateMap<ParentDTO, ParentObject>();
Mapper.CreateMap<ChildDTO, ChildObject>();

Таким образом, я должен добавить сеттер к свойству Children в ParentObject и конструктор по умолчанию (без параметров) в ChildCollection. Хотя я могу обойти необходимость определения отношений родитель-потомок, кажется, было бы логично ожидать, что AutoMapper будет поддерживать настройку карты для использования определенного конструктора при создании дочерней коллекции. Примерно так:

Mapper.CreateMap<ParentDTO, ParentObject>()
    .ForMember(obj => obj.Children, opt.MapFrom(dto => dto.Children))
    .ConstructUsing(col => new ChildCollection(obj));

Обратите внимание, что я передаю ссылку на «obj», который является отображаемым экземпляром ParentObject.

5
задан Gracie 7 January 2019 в 20:52
поделиться