Как объекты-значения сохраняются и загружаются?

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

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

  • Сообщение (объект)
  • Комментарий (объект значения)
  • Тег (объект значения)
  • PostsRespository (Репозиторий)

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


person yeraycaballero    schedule 16.02.2010    source источник


Ответы (3)


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

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

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

  • «Постоянство — не повод превращать все в сущности.»

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

person yeraycaballero    schedule 17.02.2010
comment
Реляционные базы данных и ORM часто обманом заставляют нас создавать случайные сущности jefclaes.be/2013/05/accidental-entities-you-dont-need-that.html - person JefClaes; 27.05.2013
comment
@yeraycaballero Если я сохраняю объект значения в текстовом столбце (вариант 3), как мне выполнить атомарное обновление объекта значения? - person Po-Ying Chen; 04.03.2018
comment
@yeraycaballero Такая хорошая статья, которая мне очень помогла. Спасибо - person Mohammad; 14.10.2020

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

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

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

person smaclell    schedule 17.02.2010
comment
Спасибо за ответ. Итак, у вас есть TagsRepository. У вас тоже есть таблица тегов в базе данных? - person yeraycaballero; 17.02.2010
comment
На самом деле я еще не определился с базой данных. У меня, вероятно, не будет отдельной базы данных, и я настоятельно рассматриваю решение для базы данных объектов или документов, такое как mongo или диван. - person smaclell; 17.02.2010

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

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

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

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

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

person jpierson    schedule 03.12.2012