2009-04-16 19 views
3

Ich möchte der DDD-Philosophie folgen und nicht direkt auf Entitätsobjekte eines Aggregats zugreifen. Also muss ich das Root-Objekt aufrufen, um die zugehörige Entity zu erhalten. Aber in anderen Fällen möchte ich nicht immer jede assoziierte Entität laden, wenn die Wurzel aufgerufen wird. Ist das der Zweck des faulen Ladens?Zugriff auf Aggregat-Entities ohne Lazy Loading

Wie greife ich auf Entitätsobjekte über das Stammverzeichnis zu, ohne jedes zugeordnete Objekt jedes Mal zu laden, wenn ich das Lazyloading-Feature von linq deaktiviere?

EDIT:

Zum Beispiel, Wenn ich eine Person als die Root-Entität, und die Person hat Namen, Adressen und OwnedProperties. Wenn ich eine Liste von Personen erhalten möchte, damit ich ihre Namen anzeigen kann, möchte ich nicht unbedingt Ownership-Eigenschaften laden jedes Mal auf den Aufruf des Repository. Umgekehrt möchte ich auf einer anderen Seite möglicherweise eine Liste von OwnedProperties anzeigen, möchte aber nicht, dass die anderen Informationen mit dem Aufruf geladen werden. Was ist der einfache Weg, die Person nur ohne die Eigentumseigenschaft entity aufzurufen, außer ein neues Personenobjekt ohne diese eigenen Eigenschaften zu erstellen?

+0

können Sie ein konkretes Beispiel geben? –

+0

Wahrscheinlich nicht. DDD ist eine jener vagen Prinzipien, die keine konkreten Beispiele haben. – cletus

+1

@Cletus, es gibt viele konkrete Beispiele .. siehe das Evans-Buch ... –

Antwort

1

Ich glaube nicht, dass das ohne Lazy Loading möglich ist.

  • alle Daten auf einmal bekommen: Eager Loading
  • Daten bekommen, wenn zugegriffen: Lazy Loading-
1

nach Ihrer edit: Was ich in diesen Situationen zu tun, ist es, eine 'Ansicht' Klasse erstellen oder eine "DTO" -Klasse, die nur die Eigenschaften enthält, an denen ich interessiert bin. Zum Beispiel könnte ich eine 'PersonView'-Klasse haben, die zum Beispiel nur eine Name-Eigenschaft hat.

Dann, mit meinem OR/M-Mapper (ich verwende NHibernate), ich erstellen eine HQL-Abfrage (oder Criteria-Abfrage), die auf meine "Person" -Entität funktioniert. Bevor ich die Abfrage ausführe, sage ich NHibernate, dass ich "PersonView" -Objekte als Ergebnis haben möchte (ich spezifiziere eine Projektion). Dann ist NHibernate intelligent genug, um eine Abfrage auszuführen, die nur die Spalten abruft, die zum Füllen der PersonView-Instanzen erforderlich sind.

+0

in Ihrem Fall, würde Ihr Repository für jedes Szenario Überladungen haben müssen, und dann entscheiden, welche Methode im Repository aufrufen? – zsharp

+0

Wie genau meinst du? Ich würde eine Methode in meinem Repository haben, die zum Beispiel "FindPersons" heißt, die "PersonView" -Instanzen zurückgibt. –

0

Eine Möglichkeit zur Vermeidung von Lazy Loading ist nur mit dem Objekt 'ID'