Доступ к совокупным сущностям без отложенной загрузки

Я хочу следовать философии DDD и не обращаться напрямую к сущностным объектам агрегата. Итак, я должен вызвать корневой объект, чтобы получить связанный объект. Но в других случаях я не всегда хочу, чтобы каждый связанный объект загружался при вызове корня. Это цель ленивой загрузки?

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

РЕДАКТИРОВАТЬ:

Например, если у меня есть человек в качестве корневой сущности, а у человека есть имя, адреса и свойства. Если я хочу получить список людей, чтобы я мог отображать их имена, я не хочу каждый раз загружать собственные свойства при вызове репозитория. И наоборот, на другой странице я могу захотеть показать список OwnedProperties, но не хочу, чтобы другая информация загружалась вместе с вызовом. каков простой способ просто вызвать Person без объекта принадлежащего свойства, кроме создания нового объекта person без этих принадлежащих свойств?


person zsharp    schedule 16.04.2009    source источник
comment
можете привести конкретный пример?   -  person Sam Saffron    schedule 17.04.2009
comment
Возможно нет. DDD — это один из тех расплывчатых наборов принципов, у которых нет реальных примеров.   -  person cletus    schedule 17.04.2009
comment
@Cletus, есть много конкретных примеров ... см. книгу Эванса ...   -  person Sam Saffron    schedule 17.04.2009
comment
Это тревожный признак, когда и абстракции предметной области, и системные абстракции настолько концептуальны, что вы не можете легко распознать, о чем идет речь. Хороший пример печально известного принципа Просто добавьте еще один уровень абстракции. или Одно кольцо, чтобы править ими всеми.   -  person dkretz    schedule 17.04.2009


Ответы (3)


Я не думаю, что это возможно без ленивой загрузки.

  • Получение всех данных сразу: жадная загрузка
  • Получение данных при доступе: отложенная загрузка
person TWith2Sugars    schedule 05.06.2009

В соответствии с вашим редактированием: в этих ситуациях я создаю класс «Просмотр» или класс «DTO», который просто содержит интересующие меня свойства. Например, у меня может быть класс «PersonView», который просто например, имеет свойство Name.

Затем, используя мой преобразователь OR/M (я использую NHibernate), я создаю запрос HQL (или запрос Criteria), который работает с моей сущностью «Человек». Перед выполнением запроса я сообщаю NHibernate, что в результате мне нужны объекты PersonView (я указываю проекцию). Затем NHibernate достаточно умен, чтобы выполнить запрос, который извлекает только те столбцы, которые необходимы для заполнения экземпляров PersonView.

person Frederik Gheysels    schedule 05.06.2009
comment
в вашем случае, не должен ли ваш репозиторий иметь перегрузки для каждого сценария, а затем решать, какой метод вызывать в репозитории? - person zsharp; 05.06.2009
comment
Как именно вы имеете в виду? У меня был бы метод в моем репозитории, который называется, например, «FindPersons», который возвращает экземпляры «PersonView». - person Frederik Gheysels; 06.06.2009

Один из способов избежать ленивой загрузки — просто использовать идентификатор объекта.

person SystematicFrank    schedule 04.01.2014