2009-08-04 4 views
4

Я недавно рассматривал шаблон хранилища как способ очистить все детали упорства под ковром, где речь идет о клиентском коде. Во время чтения вокруг появляется, что репозиторий является/может быть [обычно?] Ответственным за агрегаты, а не просто прямолинейными классами.Агрегаты и хранилища. Как определить агрегаты?

Это имеет смысл для меня, как вы могли бы иметь класс определения сообщения и другое определение Комментарии. Это делает идеальный кандидат для совокупности, поскольку эти два очень тесно связаны между собой. Однако как бы я представлял пользователей класс и его отношения с его или ее Должности?

ли смысл агрегировать пользователей с сообщений/Комментарии агрегат, или держать USers сам по себе и просто иметь ассоциацию с помощью хорошей старомодной ссылки?

Я попытался найти ответ самостоятельно с помощью Google, но многие примеры, которые я нахожу, просто автономны. т.е. Должности/комментарии или, может быть, Заказ и OrderLine и т. д. Я не могу найти ничего, что показывало бы, как другие связанные классы подходят друг другу.

Я не применяю это к чему-либо конкретному, хотя PHP или Java/C#, вероятно, будут областью, в которой я хотел бы использовать эти идеи. В любом случае я просто изучаю и пытаюсь разгадать некоторые из этих идей и концепций, прежде чем убегу и создаю монстра. :)

Спасибо за ваше время.

ответ

3

Шаблон репозитория довольно слабо определен и не обязательно имеет какое-либо отношение к Агрегатному шаблону. Однако, если вы подписались на способ DDD делать вещи, то да, репозитории уникальны для агрегатов.

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

В вашем случае, когда вы удаляете сообщение, я предполагаю, что вы также удалите комментарии, но не пользователь, создавший сообщение, или пользователи, которые его прокомментировали. Поэтому вы правильно определяете агрегат post/comment, но было бы бессмысленно группировать пользователей в этот агрегат.

Пользователи, являющиеся его собственным агрегатом, могут содержать отношение ко всем своим сообщениям, поскольку Post - это совокупный корень. Вы также можете реализовать этот метод в PostRepository, чтобы получить все сообщения данного пользователя. Надеюсь, это поможет!

+0

А я понимаю. Если один объект полностью зависит от другого, имеет смысл объединить их. Таким образом, комментарии не могут существовать без сообщений. Хотя, я думаю, вам нужно рисовать линию в некоторых местах. Удаление пользователя не обязательно означает, что их сообщения/комментарии исчезают, и даже если они это делают, имеет смысл иметь пользователей как отдельный объект. В качестве небольшого аспекта, где логическое место для размещения фактического SQL для запроса базы данных [или любого другого механизма, который я использую для сохранения)? Будет ли это в Репозитории или Агрегатах ... или даже ниже?Спасибо за помощь! – Etzeitet

+0

Вы поняли. Репозиторий * действует *, как если бы он был в памяти, но реализован для перехода в хранилище данных. Это означает, что в интерфейсе репозитория нет упоминания о доступе к SQL или данным, но реализация выполняется, это ваша абстракция. –

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