2010-07-02 3 views
2

Выполнение небольшого чтения вокруг проекта, управляемого доменом, и кажется, что вы должны получить доступ ко всем сущностям в совокупности путем обхода из корня агрегата.Агрегаты перемещения

Однако в то же время вы должны попробовать и инкапсулировать свои данные, чтобы свойства/поля были защищены или закрыты.

Поэтому мой вопрос: если поля защищены/приватны, как вы должны проходить через агрегат?

Способ, которым я настроил это в данный момент, заключается в следующем: я отмечаю все свойства моей модели домена как внутренние с методами «настройки», отмеченными как защищенные. Таким образом, по крайней мере ничто вне модели не может получить доступ к свойствам, но объекты внутри модели могут получить доступ к другим объектам, и я все же разрешаю устанавливать свойства только внутри самого объекта.

Несмотря на то, что я сделал это, я все еще чувствую, что это должно применяться только к свойствам для других агрегатных объектов (я имею в виду, что «имя» клиента все равно будет частным, но их «Заказы» должны быть отмечены как внутренняя, чтобы обеспечить обход Клиента -> Заказы -> и т. д.)

У кого-нибудь есть рекомендации по этому вопросу?

EDIT:

Позвольте мне попытаться дать более конкретный пример вопроса: У меня есть два объекта в моем графике объекта: Книжная полка и книги. Скажем, ради этого примера, что Книжная полка является совокупным корнем и что Книги хранятся на книжной полке, так что это просто сущности внутри совокупности (Книжная полка имеет коллекцию книг).

Я хочу написать способ добавления новой книги на книжную полку. Следуя рекомендациям DDD, я считаю, что должен написать метод в классе Bookshelf, например AddBook (Book Book).

Однако, если есть требование о том, что на книжную полку не может быть добавлена ​​книга с таким же названием. Мне нужна логика в методе Bookshelf.AddBook для проверки коллекции книг, чтобы убедиться, что эта книга еще не существует.

Проблема теперь в том, что я не могу этого сделать, поскольку я написал объект книги в красиво инкапсулированном виде, а его свойство «Имя» не является общедоступным.

Я понимаю, что это довольно надуманный пример, но я надеюсь, что это лучше иллюстрирует проблему. Я также понимаю, что это не просто проблема DDD, а инкапсуляция OO в действительности. Я уверен, что должен быть очень распространенный, простой способ решить то, что я пытаюсь сделать, и я сильно его переусердствовал.

ответ

2

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

Другими словами, нет ничего плохого в том, чтобы разоблачить свойство имени книги на Книжной полке, но было бы неправильно (в смысле лучших практик DDD) выставить имя Книги другим агрегатам. Было бы также неправильно раскрывать модифицируемый сборник книг. Публикация коллекции только для чтения должна проводиться с осторожностью - это может быть признаком нарушения инкапсуляции.

Ответит ли это на ваш вопрос?

+0

Он отвечает на вопрос, и я полагаю, это то, что я имел в виду, говоря, что я его переусердствовал - это так же просто, как просто немного смягчить правила и сделать доступным свойство, но только в совокупности. Возникает вопрос, какие функции языка C# вы использовали бы, чтобы разрешить доступ к имени книги на книжную полку, но не к классам вне этого агрегата? (Думая об этом в терминах различных агрегатов для одного ограниченного контекста, находящегося в пределах одной сборки C#) – Justin

-1

Visitor pattern является типичным механизмом обхода.

+0

Это не совсем тот тип обхода, который, как я думаю, имеет здесь значение. Шаблон посетителя позволит мне пересечь граф объектов и выполнить действие на каждом узле графика. Однако я говорю только о ссылках содержащихся объектов из родительского объекта - например: var customerOrderLineItems = customer.Orders [0] .OrderLines; – Justin

+0

У вас есть несколько вариантов. Прежде всего, некоторые считают, что вы не должны «входить» в подобные объекты. Это указывает на то, что вы обрабатываете граф объектов как носителей немого значения, а не как самодостаточные, самоуправляемые объекты. Если операция достаточно сложна для класса, это должна быть операция над классом, при необходимости делегируя частным содержащимся объектам. Если вам нужна развязанная система с двойной отправкой, то шаблон посетителя - это путь. Любой другой подход связывает несколько методов с несколькими объектами в наборе отношений N * M: проблема обслуживания. –

Смежные вопросы