2009-02-06 4 views
16

Ich wickle immer noch den Kopf über DDD, und einer der Stolpersteine, die ich angetroffen habe, ist, wie man mit Assoziationen zwischen separaten Aggregaten umgehen kann. Angenommen, ich habe ein Aggregat, das Kunden einkapselt, und ein weiteres, das Verkehre einkapselt.Wie gehen Sie mit Assoziationen zwischen Aggregaten in DDD um?

Aus geschäftlichen Gründen Sendungen sind ihre eigenen Aggregate, und doch müssen sie explizit an Kunden gebunden sein. Sollte meine Kundendomäneneinheit eine Liste von Sendungen haben? Wenn ja, wie befülle ich diese Liste auf der Repository-Ebene - vorausgesetzt, ich verfüge über ein CustomerRepository und ein ShipmentRepository (ein Repo pro Aggregat)?

Ich sage 'Assoziation' und nicht 'Beziehung', weil ich betonen möchte, dass dies eine Domänenentscheidung ist, keine Infrastruktur - ich entwerfe das System zuerst vom Modell.

Bearbeiten: Ich weiß, ich brauche Tabellen nicht direkt zu Objekten modellieren - das ist der Grund, warum ich das Modell zuerst entwerfe. An dieser Stelle interessiert mich die Datenbank überhaupt nicht - nur die Assoziationen zwischen diesen beiden Aggregaten.

+1

ddd ist das nicht das Gnu-Tool http://www.gnu.org/software/ddd/? seit wann steht ddd für domain-driven-design ??? – Johan

+0

@ Johan - eine Weile, jetzt - http://domaindrivendesign.org/ –

+1

@Erik, gut Dinge ändern sich und so tun die kurzen Versionen der langen Worte. – Johan

Antwort

8

Es gibt keinen Grund, warum Ihr ShipmentRepository keine Kundendaten in Ihre Versandmodelle zusammenfassen kann. Repositories müssen nicht 1: 1 mit Tabellen zugeordnet werden.

Ich habe mehrere Repositories, die mehrere Tabellen in einem einzigen Domänenmodell kombinieren.

+0

Sie sagen also, dass es in Ordnung ist, dieselben Daten über zwei verschiedene Aggregatwurzeln zugänglich zu machen? –

5

Ich denke, es gibt zwei Ebenen der Beantwortung dieser Frage. Auf einer Ebene lautet die Frage, wie ich die Beziehung zwischen Kunde und Versand bevölkern kann. Ich mag die "fill" -Semantik, bei der Ihr Versand-Repository einen fillOrders (Liste Kunden, ....) haben kann.

Die andere Ebene ist "Wie gehe ich mit den denormalisierten Domänenmodellen um, die Teil von DDD sind". Und "Kunde" ist wahrscheinlich das beste Beispiel von allen, weil es einfach in so vielen verschiedenen Kontexten auftaucht; Fast alle Ihre Prozesse haben Kunden und der Kontext des Kunden ist in der Regel sehr vielfältig. Bei höchstens der Hälfte der Zeit sind Sie an den "Bestellungen" interessiert. Wenn mein Verständnis der Domäne zu Beginn perfekt wäre, würde ich nie ein Kunden-Domain-Konzept machen. Aber das ist es nicht, und so bringe ich immer den Kunden zum Objekt. Ich erinnere mich noch an das Projekt, wo ich nach 3 Jahre fühlte, dass ich in der Lage war, das richtige "Kunden" -Domänenmodell zu machen. I würde für die alternativen und detaillierteren Konzepte suchen, die auch den Kunden darstellen; PotentialCustomer, OrderingCustomer, CustomerWithOrders und wahrscheinlich einige andere; Entschuldigung, die Namen sind nicht besser. Ich brauche dafür noch etwas Zeit;)

0

Versand hat Beziehung viele-zu-eins-Beziehung mit dem Kunden. Wenn Sie nach den Sendungen eines Kunden suchen, fügen Sie Ihrem Versandrepository eine Abfrage hinzu, die einen Clientparameter annimmt.

Im Allgemeinen erzeuge ich keine Eins-zu-Mähne-Assoziationen zwischen Entitäten, wenn die viele Seite nicht begrenzt ist.

Verwandte Themen