DDD: Bezieht sich auf eine Entität in einem Aggregatstammverzeichnis nach ihrer Identität

8

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 , also fange ich hier mit einem anderen Beispiel an.

Nehmen wir an, wir möchten ein OrderLine in einem Order :

ändern
  • Der Benutzer ruft eine Seite auf, auf der er die Bestellzusammenfassung mit allen Bestellzeilen sehen kann.
  • Der Benutzer klickt auf die Schaltfläche Bearbeiten neben einer Bestellposition.
  • Er wird an 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?

    
Benjamin 05.09.2011, 16:19
quelle

3 Antworten

12

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.

    
Dmitry 05.09.2011, 17:10
quelle
1

OrderLineId ist was genau? Es hat keine Bedeutung. Du aktualisierst die Menge eines PRODUKTES und das sollte als ID verwendet werden.

%Vor%     
nilskp 20.11.2011 18:12
quelle
0

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).

    
Francisco Aquino 05.09.2011 16:51
quelle