Как наилучшим образом выбрать одну сущность из дочерней коллекции совокупного корня, используя NHibernate? - PullRequest
1 голос
/ 20 сентября 2011

Мне интересно, что считается лучшей или более правильной практикой в ​​следующем сценарии:

Я сопоставил следующие бизнес-объекты с помощью NHibernate:

  • Стена
  • WallPost
  • WallPostComment

Стена имеет ноль-ко-многим WallPosts.У WallPost есть множество WallPostComments от нуля ко многим.Совокупный корень - Wall.

Я пишу задачу по добавлению WallPostComment в WallPost.Приложение является приложением MVC, и запрос на добавление нового WallPostComment содержит идентификатор WallPost, к которому относится комментарий.Чтобы добавить комментарий, мне нужно получить пост, к которому он должен быть добавлен.Мой вопрос: каков наилучший / самый правильный способ сделать это?

До сих пор я пробовал два подхода, и один из них кажется более «правильным», хотя и неэффективным.Другой, более эффективный подход кажется «неправильным».

1) Я загружаю корень агрегата Wall из сеанса и выбираю FirstOrDefault из его коллекции Posts.Это кажется «правильным» в том смысле, что я получаю доступ к записи на стене через объединенный корень, но при этом все сообщения на стене извлекаются из базы данных (неограниченный набор результатов).

2) Я загружаю стенусообщение непосредственно из сеанса с использованием wallPostId, переданного мне по запросу.Это кажется «неправильным», потому что я обхожу агрегированный корень - но это один удар по базе данных для одной строки данных.

Какой подход лучше или предпочтительнее?Какие еще у вас есть предложения?

Ответы [ 2 ]

2 голосов
/ 20 сентября 2011

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

2 голосов
/ 20 сентября 2011

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

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

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

...