Как объекты-значения сохраняются и загружаются? - PullRequest
12 голосов
/ 17 февраля 2010

Поскольку нет репозиториев для объектов-значений. Как загрузить все объекты-значения?

Предположим, мы моделируем приложение для блога и у нас есть следующие классы:

  • Post (Entity)
  • Комментарий (объект значения)
  • Tag (объект значения)
  • Архив сообщений (Respository)

Я знаю, что когда я сохраняю новое сообщение, его теги сохраняются вместе с ним в той же таблице. Но как я могу загрузить все теги всех сообщений. Должен ли PostsRespository иметь метод для загрузки всех тегов? Я обычно делаю это, но я хочу знать мнение других

Ответы [ 3 ]

10 голосов
/ 18 февраля 2010

Я ищу лучшее решение для этого вопроса, и я нашел этот пост:

http://gojko.net/2009/09/30/ddd-and-relational-databases-the-value-object-dilemma/

Этот пост очень хорошо объясняет, почему существует большая путаница с объектами значений и базами данных. Вот вам фраза, которая мне слишком понравилась:

  • " Упорство не оправдывает превращение всего в сущности. "

Гойко Адзич, дайте нам три варианта для сохранения наших ценностных объектов.

3 голосов
/ 17 февраля 2010

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

Надеюсь, это поможет.

EDIT: Отчасти благодаря этому посту я решил немного реструктурировать свое приложение. Вы правы в том, что я, вероятно, неправильно делал теги сущностью. С тех пор я изменил свое приложение так, чтобы теги были просто строками, а почтовый репозиторий обрабатывал все требования к хранилищу вокруг тегов. Для операций, которым нужны сообщения, теги загружаются вместе с ними. Для любой операции, которая требует только теги или списки тегов, в репозитории есть методы для этого.

0 голосов
/ 03 декабря 2012

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

Если вы редактируете что-то, что требует добавления и удаления тегов, таких как сообщение, то теги могут быть объектами, но, возможно, они могут быть объектами значения и загружаться и сохраняться вместе с сообщением в любом случае. Лично я склонен отдавать предпочтение объектам-значениям, если только объект не нуждается в модификации, но я понимаю, что существует разница между объектом-объектом, моделируемым как «моментальные снимки» только для чтения, и объектами фактических значений, которые не имеют идентичности. Сложность в том, что иногда то, что вы обычно считаете ключом, может быть частью объекта значения, если он не используется в качестве идентификатора в этом контексте, и я думаю, что теги попадают в эту категорию.

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

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

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

...