Frage

ich habe eine Frage bezüglich DDD und das Repository-Muster.

Say Ich habe einen Kunden-Repository für den Kunden Aggregat Wurzel. Die Get & Find-Methoden liefern das voll bestückte Aggregat, die Objekte wie Adresse enthält, usw. alles gut. Aber wenn der Benutzer für einen Kunden in der Benutzeroberfläche der Suche, ich benötige nur eine ‚Zusammenfassung‘ des Aggregats - nur ein flaches Objekt mit zusammengefassten Informationen.

Ein Weg, ich damit umgehen könnte, ist die Methode find auf das Repository als normal zu nennen, und dann in der Anwendungsschicht, Karte, jeden Kunden Aggregat zu einem CustomerSearchResult / Customer DTO und senden sie an den Client zurück.

Aber mein Problem dabei ist, Leistung; jeder Kunde Aggregat kann mehrere Abfragen erfordern alle Verbände zu füllen. Also, wenn meine Suchkriterien 50 Kunden abgestimmt, das ist ganz ein Hit auf der DB für potenziell Abrufen von Daten Ich bin nicht einmal nach Bedarf gehen.

Das andere Problem ist, dass ich wünsche, kann zusammengefasste Daten über die Kunden gehört, die außerhalb des Kunden Aggregat Wurzel Grenze, wie das Datum der letzten Bestellung beispielsweise hergestellt ist. Bestellen Sie hat ein eigenes Aggregat und damit die Kunden, um Informationen zu erhalten, ich hätte den OrderRepository nennen, auch erniedrigende Leistung.

So, jetzt denke ich, ich bin mit zwei Optionen links:

  1. Fügen Sie eine weitere Methode Suchen zum CustomerRepository, die eine Liste dieser Zusammenfassung Objekte zurückgibt, indem eine effiziente Abfrage zu tun.

  2. einen Zweck erstellen gebaut Nur-Lese-CustomerInfoRepository, dass nur die Methode find in 1 beschrieben wird.

Aber diese beiden Gefühle, wie ich gegen die Grundsätze der DDD werde. Meine Repositories erben von einer generischen Basis: Repository where T: IAggregateRoot. Dieses Zusammenfassung Info-Objekt ist kein Aggregat und sind von einem anderen Typ T, also wirklich # 1 geht gegen den Entwurf.

Vielleicht # 2 Ich würde eine abstrakte SearchRepository ohne den Zwang IAggregateRoot erstellen?

Es gibt viele ähnliche Szenarien in meinem Gebiet.

Wie würden Sie dieses Szenario implementieren?

Danke, Dave

Aktualisieren

Nachdem Theo Antwort zu lesen, ich glaube, ich mit der Option # 2 und erstelle eine spezialisierte SearchRepository in meiner Infrastruktur zu diesen Szenarien ausgerichtet gehen. Die Anwendungsschicht (WCF-Dienste) können dann diese Repositorys aufrufen, die nur die Zusammenfassung DTOs direkt bevölkern, anstatt Mapping Domäne Entitäten DTOs.

**** Update 2 ****

Obwohl ich gebeten, dies vor über einem Jahr dachte ich, würde ich nur hinzufügen, dass ich da entdeckt CQRS haben, die auf die Lösung genau dieses Problems ausgerichtet ist. Udi Dahan ( http://www.udidahan.com/ ) und Greg Young ( http://codebetter.com/gregyoung/ ) viel darüber geschrieben. Wenn Sie eine verteilte Anwendung mit DDD erstellen, ist CQRS für Sie!

War es hilfreich?

Lösung

Ich denke, dass Sie nur zusammengefasste Informationen angezeigt werden sollen. Diese Bits von zusammengefassten Informationen sind keine Einheiten oder Wertobjekte des Domänenmodells. Sie sind nur Informationen, nichts weiter.

Es ist so etwas wie die Berichterstattung Informationen zeigt. Wenn ich mit solchen Dingen beschäftigen, würde ich nicht auf die reine DDD Ansatz bleiben. Ihre vorgeschlagenen Optionen sind in Ordnung, weil es Ihre Aufgabe erledigt ist immer. DDD sollte nicht als Dogma behandelt werden. Querdenken. Lockern ein wenig DDD.

Aber beachten Sie, dass Sie nur Informationswerte außerhalb des Modells schaffen für einen bestimmten Zweck anzuzeigen. Also, wenn ein Benutzer ein Bit an Information zu einer Operation machen mit ihm (die im Domänenmodell definiert ist), müssen Sie die Kennung aus den Informationswerten extrahieren und das Einheit / Wertobjekt / Aggregat aus einem Repository herausziehen.

ich dieses Video wird dringend empfohlen: Eric Evans: Was ich über DDD gelernt habe seit das Buch . Wenn Sie sein Buch lesen, sollten Sie wirklich das ganze Video sehen. Pay sehr aufmerksam auf Zeit, 30:00 wo Eric Evans sich über Aggregate spricht und bezieht sich auf das Problem, das Sie im Moment haben.

Andere Tipps

Ich würde:

  1. Zurück ein anderes Objekt, das einen Blick auf mein Objekt für die Anzeige darstellt, z.B. Customer.
  2. Zurück ein Datatable. Oft ist ein generischer Container ist der einfachste und bester Weg zu gehen.

Wenn die T in Ihrer generischen Basis-Repository ein Kunde ist, dann denke ich, Sie sind falsch Anwendung des Konzepts der aggregierten Wurzeln, obwohl ich bin keine strenger Evansangelist . Ich würde ein Repository für Kunden entwerfen, die alle Daten zurückgegeben, die logisch oder bequem Gruppen mit Kunden einschließlich Tables oder schreibgeschützte Objekte, die Ansichten von Kundendaten sind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top