Das Problem, mit dem ich ständig konfrontiert bin, ist der Umgang mit berechneten Werten, die von der Domänenlogik gesteuert werden, während ich weiterhin effizient mit dem Datenspeicher arbeite.
Beispiel:
Ich sende eine Liste von Produkten aus meinem Repository über einen Dienst zurück. Diese Liste wird durch Paginierungsinformationen aus dem vom Client gesendeten Anforderungs-DTO begrenzt. Darüber hinaus gibt das DTO einen Sortierparameter an (eine clientfreundliche Aufzählung).
In einem einfachen Szenario funktioniert alles hervorragend: Der Dienst sendet Paging- und Sortierausdrücke an das Repo, und das Repo gibt eine effiziente Abfrage an die Datenbank aus.
Das alles bricht jedoch zusammen, wenn ich nach Werten sortieren muss, die aus meinem Domänenmodell im Speicher generiert wurden. Beispielsweise verfügt die Produktklasse über eine IsExpired () -Methode, die einen auf Geschäftslogik basierenden Bool zurückgibt. Jetzt kann ich nicht mehr auf Repo-Ebene sortieren und blättern - alles wäre im Speicher erledigt (ineffizient), und mein Dienst müsste wissen, wann diese Parameter an das Repo ausgegeben werden müssen und wann Sortieren / Paging durchgeführt werden muss selbst.
Das einzige Muster, das mir sinnvoll erscheint, besteht darin, den Status der Entität in der Datenbank zu speichern (machen Sie IsExpired () zu einem schreibgeschützten Feld und aktualisieren Sie es vor dem Speichern über die Domänenlogik). Wenn ich diese Logik in ein separates Repository "read model / dto" und "reporting" aufteile, mache ich mein Modell anämischer, als ich es gerne hätte.
Übrigens, jedes Beispiel, das ich für solche Berechnungen gesehen habe, scheint sich wirklich auf die In-Memory-Verarbeitung zu stützen und die Tatsache zu beschönigen, dass es auf lange Sicht weitaus weniger effizient ist. Vielleicht optimiere ich vorzeitig, aber das passt einfach nicht zu mir.
Ich würde gerne hören, wie andere damit umgegangen sind, da ich sicher bin, dass es bei fast allen Projekten mit DDD üblich ist.
quelle
Ich denke, ich würde fragen, welche Geschäftslogik bestimmt, ob isExpired wahr ist oder nicht. Kann diese Logik von einer Abfrage ausgeführt werden, wenn das Datenmodell steht? Wenn ja, können Sie Ihr Repository intelligent genug machen, um die "isExpired" -Logik zu verwenden, wenn Sie es auf bestimmte Weise nach Produkten fragen? Wenn nicht, müssen Sie möglicherweise Ihr Datenmodell erneut überprüfen.
DDD bedeutet nicht, dass Ihre Repositorys dumm sein müssen - es bedeutet nur, dass Ihre Domain wissen muss, wie sie mit Ihren Repositorys kommunizieren kann.
quelle