Ich beschäftige mich mit Domain Driven Design und einige der Konzepte, denen ich begegne, sind auf den ersten Blick sehr sinnvoll, aber wenn ich mehr über sie nachdenke, muss ich mich fragen, ob das wirklich eine gute Idee ist.
Das Konzept der Aggregate macht zum Beispiel Sinn. Sie erstellen kleine Eigentumsdomänen, damit Sie sich nicht mit dem gesamten Domänenmodell befassen müssen.
Wenn ich im Zusammenhang mit einer Web-App darüber nachdenke, stoßen wir häufig auf die Datenbank, um kleine Teilmengen von Daten zurückzugewinnen. Zum Beispiel kann eine Seite nur die Anzahl der Bestellungen mit Links auflisten, auf die Sie klicken können, um die Bestellung zu öffnen und ihre Bestell-IDs anzuzeigen.
Wenn ich recht Verständnis Aggregates bin, würde ich in der Regel die Repository - Muster verwenden , um eine OrderAggregate zurück, die die Mitglieder enthalten würde GetAll
, GetByID
, Delete
, und Save
. OK das hört sich gut an. Aber...
Wenn ich GetAll aufrufe, um alle meine Bestellungen aufzulisten, scheint es mir, dass für dieses Muster die gesamte Liste der gesammelten Informationen zurückgegeben werden muss, Bestellungen, Bestellpositionen usw. abgeschlossen werden müssen. Wenn ich nur eine kleine Teilmenge dieser Informationen benötige (nur Header-Informationen).
Vermisse ich etwas? Oder gibt es eine Optimierungsstufe, die Sie hier verwenden würden? Ich kann mir nicht vorstellen, dass sich irgendjemand dafür aussprechen würde, ganze Informationsaggregate zurückzugeben, wenn Sie sie nicht benötigen.
Sicherlich könnte man Methoden auf Ihrem Repository wie erstellen GetOrderHeaders
, aber das scheint den Zweck der Verwendung eines Musters wie Repository an erster Stelle zu zunichte zu machen.
Kann das jemand für mich klären?
BEARBEITEN:
Nach viel mehr Recherche denke ich, dass die Trennung hier darin besteht, dass sich ein reines Repository-Muster von dem unterscheidet, was die meisten Leute von einem Repository halten.
Fowler definiert ein Repository als einen Datenspeicher, der Auflistungssemantik verwendet und im Allgemeinen im Arbeitsspeicher aufbewahrt wird. Dies bedeutet, dass ein komplettes Objektdiagramm erstellt wird.
Evans ändert das Repository so, dass es Aggregate Roots enthält, und daher wird das Repository amputiert, um nur die Objekte in einem Aggregat zu unterstützen.
Die meisten Leute scheinen Repositorys als verherrlichte Datenzugriffsobjekte zu betrachten, bei denen Sie nur Methoden erstellen, um die gewünschten Daten abzurufen. Dies scheint nicht die Absicht zu sein, die in Fowlers Patterns of Enterprise Application Architecture beschrieben wird.
Wieder andere betrachten ein Repository als eine einfache Abstraktion, die in erster Linie dazu dient, das Testen und Verspotten zu vereinfachen oder die Persistenz vom Rest des Systems zu entkoppeln.
Ich denke, die Antwort ist, dass dies ein viel komplexeres Konzept ist, als ich zuerst dachte.