Должны ли сообщение и комментарий быть в совокупности сообщений или они должны быть собственными? - PullRequest
4 голосов
/ 25 февраля 2011

Рассмотрим типичный блог с объектами Post и Comment.

. Для демонстрационного примера DDD, который я строил, я обнаружил (до сих пор), что обе сущности Post и Commentбыли подходящими для того же агрегата - агрегат Post.Но теперь я не уверен ...

В моих контроллерах я нахожу, как и следовало ожидать, что мне нужно добавить и удалить Comments из Posts.С моей текущей моделью я не отслеживаю идентичность Comment во всем мире (как предполагает Синяя книга).Возможно, вы ожидаете, что мое действие по удалению Comment может выглядеть так:

public ActionResult DeleteComment(int postID, int commentID)

Очевидно, мне нужен идентификатор Post для его извлечения из хранилища и идентификатор для конкретного Comment на том Post, который я хочу удалить.

Моя проблема в теле действия DeleteComment(:

Можно ли пройти через Post с помощью механизма запросовполучить Comment для удаления?как это:

var comment = this._postRepo.WithID(postID).Comments
    .SingleOrDefault(c => c.ID == commentID);
this._postRepo.Delete(comment);
return RedirectToAction("detail", new { id = postID });

.. или я должен выбрать Comment из репо, аналогичного этому?:

var comment = this._postRepo.CommentWithID(commentID)

.. или:

var comment = this._postRepo.CommentWithID(postID, commentID)

Два приведенных выше примера могут показаться немного глупыми, поскольку мне не нужен идентификатор Post, если я могу отслеживать Comment в глобальном масштабе.Но тогда, если я отслеживаю Comment в глобальном масштабе, разве он не должен иметь свою собственную совокупность, и тогда это правильно, когда Post и Comment, кажется, идут вместе?

Ответы [ 3 ]

3 голосов
/ 25 февраля 2011

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

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

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

2 голосов
/ 26 февраля 2011

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

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

1 голос
/ 25 февраля 2011

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

...