Ich suche den richtigen Weg, um auf Entities zu verweisen, die innerhalb eines aggregierten root liegen, wenn wir nur ihre Identitäten erhalten von URL-Parametern. Ich habe eine vorherige Frage gestellt, die sich auf value-Objekte
Nehmen wir an, wir möchten ein OrderLine
in einem Order
:
edit-order-line?orderId=x&orderLineId=y
verwiesen
Wenn ich jetzt die Menge in der OrderLine aktualisieren muss, kann ich Folgendes tun:
%Vor%Ich fühle mich jedoch nicht sehr wohl dabei, dem Orden die Verantwortung zu überlassen, Teile von sich selbst per ID zurückzuholen. Meine Ansicht zu diesem Thema ist, dass innerhalb der Domäne nur mit Objekten und niemals mit IDs gesprochen werden sollte. IDs sind nicht Teil der ubiquitären Sprache und ich glaube, dass sie außerhalb der Domäne leben sollten, zum Beispiel im Controller.
Ich würde mich sicherer fühlen mit etwas wie:
%Vor%Obwohl mir die Idee, direkt mit einem Entity Manager zu interagieren, nicht gefällt. Ich habe das Gefühl, dass ich die Verantwortlichkeiten von Repository und Aggregate Root umgehe (weil ich möglicherweise direkt mit der OrderLine interagieren kann).
Wie arbeitest du da herum?
Meiner Meinung nach ist an diesem Ansatz nichts falsch:
%Vor% orderLineId
ist eine "lokale Identität". Es ist spezifisch für die Zusammenfassung von Root und macht außerhalb davon keinen Sinn. Sie müssen es nicht "ID" nennen, es kann "Bestellzeilennummer" sein. Aus Eric Evans Buch:
ENTITÄTEN innerhalb der Grenze haben eine lokale Identität, die nur innerhalb der Grenzen einzigartig ist das AGGREGATE.
... nur AGGREGATE-Wurzeln können direkt mit Datenbankabfragen erhalten werden. Alle anderen Objekte müssen durch Durchlaufen von Assoziationen gefunden werden.
Aggregatwurzeln sind an Kontext gebunden, in Ihrem Kontext ist die Reihenfolge der AR, also ist es in Ordnung, sie direkt zu aktualisieren, da Sie sie direkt verfügbar machen, wenn dieser Code betrifft andere Entitäten, die sie in der Reihenfolge AR leben sollten.
Wenn Sie einen puristischeren Ansatz wünschen, müssen Sie entweder eine findByOrderId im AR erstellen und diese vollständig laden oder die OrderLine und OrderId in Ihrer Anwendung verfügbar machen (dann mit Ihrem zweiten Ansatz).
Tags und Links language-agnostic entity domain-driven-design aggregateroot identity