Отображение дочерней коллекции только для чтения с помощью AutoMapper

Это не столько вопрос, поскольку я нашел способ делать то, что хочу, но похоже, что должен быть способ сделать это лучше. Я искал везде и ничего не нашел.

По сути, у меня есть то, что я считаю очень стандартной объектной моделью.

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, поэтому мне нужно об этом беспокоиться. Но по одному. :)

Надеюсь, это поможет кому-то другому, столкнувшемуся с той же проблемой, и, возможно, тот, кто решил ее правильно, сможет исправить меня.

16
задан Geoff Bennett 8 November 2011 в 05:45
поделиться