Как лучше всего выбрать одну сущность из совокупной дочерней корневой коллекции с помощью NHibernate?

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

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

  • стена
  • WallPost
  • СтенаПостКомментарий

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

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

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

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

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

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


person Øyvind    schedule 20.09.2011    source источник


Ответы (2)


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

person stevef4000    schedule 20.09.2011
comment
Неплохо подмечено. Я всегда думал о стене как о сущности и совокупном корне - но когда я прочитал ваш ответ, у меня возникло еще одно из этих «а-ха!» моменты. Мне придется подумать над этим еще немного, но это вполне может быть так. Фактически, этот ответ так же верен, как и ответ Мухаммеда - он просто зависит от домена, не так ли! - person Øyvind; 20.09.2011

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

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

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

person Mohamed Abed    schedule 20.09.2011
comment
Благодарность! Я только что выпил одно из тех «ааа!» моменты - теперь это немного очевидно, когда вы это говорите! Действительно, WallPost может быть хорошим кандидатом на роль агрегированного корневого каталога. Я исследую это немного подробнее, но я думаю, что вы правы. И я списал это на комбинацию неопытности и программирования в 2 часа ночи, что я не думал об этом раньше :-) Спасибо! - person Øyvind; 20.09.2011
comment
Хорошо, я долго думал об этом и решил выбрать другой ответ в качестве ответа на мой вопрос - но это только потому, что он лучше соответствует моему домену. Я думаю, что этот ответ одинаково верен - он просто зависит от домена (и я решил немного изменить свой) ... извините! - person Øyvind; 21.09.2011