Как най-добре да изберете единичен обект от дъщерна колекция на обобщен корен с помощта на NHibernate?

Чудя се какво се счита за по-добра или по-правилна практика в следния сценарий:

Картографирах следните бизнес обекти с NHibernate:

  • Стена
  • Пост на стената
  • WallPostComment

Една стена има от нула към много WallPosts. WallPost има от нула към много WallPostComments. Общият корен е Стена.

Пиша задача за добавяне на WallPostComment към WallPost. Приложението е MVC приложение и заявката за добавяне на новия WallPostComment съдържа идентификатора на WallPost, към който принадлежи коментарът. За да добавя коментара, трябва да извлека публикацията, към която трябва да се добави. Въпросът ми е: кой е най-добрият/най-правилният начин да направите това?

Досега съм пробвал два подхода и единият ми се стори по-„правилен“, въпреки че е неефективен. Друг, по-ефективен, подход се усеща като „грешен“.

1) Зареждам корена на агрегата на стената от сесията и избирам FirstOrDefault от неговата колекция Posts. Това се чувства „правилно“, тъй като имам достъп до публикацията на стената чрез обобщения корен, но това води до извличане на всички публикации на стената от базата данни (неограничен набор от резултати).

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 е кандидат сам по себе си да бъде обобщен root, по този начин той има свое собствено хранилище и можете да го изтеглите отделно и да работите с него и неговите коментари. и няма проблем, когато сборен корен (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