Как вы сохраняете / восстанавливаете совокупные корни с сущностями в DDD? - PullRequest
3 голосов
/ 28 февраля 2011

На основе следующих определений из доменного проектирования: решение проблемы сложности в основе программного обеспечения,

Совокупность: Кластер связанных объектов, которые рассматриваются как единое целое с целью изменения данных. Внешние ссылки ограничены одним членом AGGREGATE, обозначенным как корень. Набор правил согласованности применяется в границах AGGREGATE.

Я не думаю, что Совокупный корень должен содержать ссылку на хранилище. Поскольку единый корень является единственным, который должен содержать ссылки на свои сущности и агрегаты, они должны быть частными.

Как мой репозиторий может сохранить и восстановить эти личные данные?


Edit:

Давайте возьмем классический Order, пример OrderLines.

Порядок - Совокупный корень.

Это строки сущностей.

Поскольку Агрегированный корень (заказ) является единственным объектом, которому разрешено хранить ссылки на его сущности (строки заказа), я не понимаю, как бы я сохранил строки заказа из хранилища.

Ответы [ 2 ]

3 голосов
/ 09 августа 2011

Насколько я понимаю, совокупный корень должен быть местом для доступа ко всем сущностям в его области видимости. Это означает, что до тех пор, пока используется традиционный ORM, вы можете получить доступ к OrderLines через Order.

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

С точки зрения DDD вы будете использовать хранилище, чтобы скрыть доступ к данным, а фабрика может, в свою очередь, использовать фабрику для сборки объекта. Факотри знает хорошо о внутренней структуре объекта и должен быть в состоянии создать новый объект или восстановить его из данных, переданных хранилищем.

Возможно, вы также можете взглянуть на CQRS + Event Sourcing, который предоставляет другой подход к сохраняющимся сущностям.

0 голосов
/ 01 марта 2011

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

Однако, если вы действительно хотите, чтобы они были частными, вам придется прибегнуть к рефлексии, иначе агрегирующая корневая сущность будет возвращать их каким-то постоянным образом (возможно, с каким-либо внутренним вызовом).

...