Это не столько вопрос, поскольку я нашел способ делать то, что хочу, но похоже, что должен быть способ сделать это лучше. Я искал везде и ничего не нашел.
По сути, у меня есть то, что я считаю очень стандартной объектной моделью.
public class Parent
{
private readonly IList<Child> _children = new List<Child>();
public IEnumerable<Child> Children { get { return _children; } }
public void AddChild(Child child)
{
child.Parent = this;
_children.Add(child);
}
}
и
public class Child
{
public Parent Parent { get; set; }
}
(Я опустил свойства, не относящиеся к проблеме, а также проверку и защиту ошибок для ясности ...)
public class ParentDTO
{
List<ChildDTO> Children = new List<ChildDTO>();
}
и
public class ChildDTO
{
}
Причина, по которой я использую метод для добавления дочерних элементов в коллекция предназначена для управления бизнес-логикой, которая должна обрабатываться при добавлении дочернего элемента.
При стандартном отображении:
Mapper.CreateMap<Parent, ParentDTO>();
Mapper.CreateMap<ParentDTO, Parent>();
Mapper.CreateMap<Child, ChildDTO>();
Mapper.CreateMap<ChildDTO, Child>();
Кажется, все работает нормально, если исходить из уровня сервиса. Потомки объекта домена полностью соответствуют списку экземпляров ChildDTO
.
Однако при обратном отображении коллекция в модели предметной области не устанавливается - очевидно, потому что она доступна только для чтения. Похоже, что нет способа напрямую установить частное поле с помощью AutoMapper. Я пробовал различные предложения, найденные здесь и в других частях Интернета.
В конце концов, я придумал следующее отображение:
Mapper.CreateMap<ParentDTO, Parent>()
.ForMember(m => m.Children, o => o.Ignore())
.AfterMap((s, d) =>
{
foreach(var c in s.Children)
d.AddChild(Mapper.Map<ChildDTO, Child>(c));
});
Это работает так, как я требовал. Однако я не могу избавиться от ощущения, что должен быть лучший способ, и я не тестировал это с существующим родителем, у которого были изменены и, возможно, добавлены и удалены дочерние элементы, поэтому я знаю, что это еще не совсем правильно.В конечном итоге эта модель предметной области сохраняется с использованием NHibernate, поэтому мне нужно об этом беспокоиться. Но по одному. :)
Надеюсь, это поможет кому-то другому, столкнувшемуся с той же проблемой, и, возможно, тот, кто решил ее правильно, сможет исправить меня.