Я пытаюсь использовать 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.