Frage

Ich möchte einige exercice tun und gelten DDD meiner Domain Model zu Northwind-Datenbank angewendet. Selbst wenn Nordwind ein Beispiel, das ich mir vorstellen, dass es einige „virtuelle Unternehmen“ Anforderungen gerecht zu werden durchgeführt wurde. Das Ziel ist also eine Domain Model haben, dass Hinsicht DDD und die Daten in Northiwnd Datenbank gespeichert ist.

Betrachten Sie dieses EF persistance Modell:


(Quelle: developpeur.org )

Beachten Sie, dass wir nur die Entitäten und Zweiweg-Beziehungen haben. Ich möchte eine echte DM haben, die DDD respektiert. Mehr, hat mein DM Modell der Spiegel meiner Datenbank

sein nicht brauchen
  1. Wie man den relations ändern würde nur eine Möglichkeit, Beziehungen oder zwei Möglichkeiten zu haben, wenn nötig.

  2. Gibt es viele-zu-eins oder eins-zu-viele Beziehungen, die auf 00.59 geändert werden könnten?

  3. Wie würden Sie agregates modellieren?

  4. Wie wäre es Werte Objekte, Dienste und Fabriken, wenn nötig?

Ich weiß wohl, dass ich auf Geschäftsanforderungen und diesen Blick aussehen shoul, wie das Modell würde sich ändern, sollte aber für Ihre advaice auf, dass haben.

Zögern Sie nicht, für weitere Details zu fragen, ob meine Frage ist nicht klar.

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Im Allgemeinen bin ich Mu zu beantworten versucht (im Zen Sinne) , weil das Szenario aus einer DDD Perspektive falsch ist. In DDD beginnen wir mit den Geschäftsanforderungen und Domain-Experten und von denen wir leiten Sie ein Domain Model .

Auch wenn es ein umstrittener Punkt ist, ist die Datenbank fast nur ein zufälliges Artefakt der fachlichen Anforderungen (das fast immer fest, dass Unternehmen müssen beibehalten werden).

Das heißt, ich werde versuchen, mein Bestes zu tun.

In den meisten Fällen ist ein Auftrag ein ziemlich wichtiger Business-Objekt, und natürlich müssen wir über die Auftragszeilen wissen, einschließlich der Produkte in jeder Zeile, so dass es scheint, als ob wir den Verein von der Auftragslinie (Order_Detail) müssen Produkt.

Wenn jedoch ein bestimmtes Produkt gegeben, wir müssen nur selten wissen, in denen Aufträge es aufgenommen wurde, so dass schlägt vor, eine Einbahn Beziehung recht. Wir können von der Bestellung Linie zur Produkt navigieren, aber nicht von Produkt zu Auftragszeilen.

Allerdings ist die obige Analyse kann sich herausstellen auf einer tieferen Ebene als falsch. Stellen Sie sich das folgende Gespräch zwischen dem Entwickler und dem Domain-Experten:

Dev. Wir haben so zu Produkten, die diese Vereinigung von Aufträgen erstellt, dass wir immer alles über die Produkte in einer bestimmten Reihenfolge kennen

Exp:? Das klingt gut, aber was ist mit dem Lieferanten

Dev. Das ist ebenfalls enthalten

Exp:? So was passiert, wenn wir die Lieferanten für das Produkt ändern

Dev: Das wird implizit in den Auftragsdaten widerspiegeln als auch ...

Exp: Das ist nicht das, was wir wollen. Wir wollen, dass die Daten die Reihenfolge zu der Zeit reflektieren wir es versendeten.

In diesem Fall stellt sich heraus, dass es tatsächlich ein Fehler im Datenbankschema. Das Problem kann durch Berichterstattung verursacht werden, weil das Geschäft Analysten möchten Berichte darüber, wie verschiedene Lieferanten belasten Ergebnis laufen (was ich weiß).

Ein solcher Fall könnte darauf hindeuten, die Zuordnung von Auftragszeilen zur Produkt insgesamt zu schneiden. Bestellungen sind historische (Snapshot) Produktdaten halten, nicht aktuelle Produktdaten.

Wir können sogar einen ProductSnapshot Value Object , die semantisch Spiegel ein Product Entity modellieren dies in der Domain Model entroduce.

Alles in allem scheint es mehr und mehr sinn Modell Order als ein Aggregat von selbst und Auftragszeilen (mit ProductSnapShots), aber was ist das Verhältnis zwischen Aufträgen und Kunden?

Als ich zur Zeit Assoziationen und Aggregate verstehen, Verbände definieren Aggregate . Bei einem gegebenen Auftrag, würden wir uns über den Kunden wissen? Höchstwahrscheinlich. Bei einem Kunden, möchten Sie über die Befehle erfahren? Wahrscheinlich.

Dies deutet auf eine Zwei-Wege-Beziehung, die Marken Customer die Aggregate Root-. Das bedeutet, dass Sie einen CustomerRepository haben würden, aber keinen OrderRepository. Jedes Mal, wenn Sie einen Auftrag benötigen, müssen Sie es über einen Customer erhalten.

In einigen Fällen kann dies durchaus Sinn machen, während dies in anderen Situationen wirklich klobig sein könnte. Es hängt wirklich von den geschäftlichen Anforderungen ...

Sie sollten erwägen eine OrderRepository zu schaffen als auch, aber das dringt in die Customer Aggregate Kennziffern. Wenn Sie das tun, es vage wird, wo die Verantwortung für den Auftrag liegt. Was passiert, wenn Sie von Auftrag an den Kunden nagigate? Customer hat eine Liste von Bestellungen, aber sie sind alle im Speicher aufgefüllt, wenn Sie die Bestellung aus dem OrderRepository lesen?

Wahrscheinlich nicht, aber sie sind wahrscheinlich zu sein, wenn Sie die Kunden aus dem CustomerRepository lesen. Der Punkt hier ist, dass die Analyse von Aggregate Roots istwichtig, und wenn Sie ein Aggregat definiert haben, werden Sie mit ihm haften haben und respektieren.

Das verursacht mich bevorzugen kleine Aggregate über große Aggregate, so in diesem Beispiel würde ich das Aggregat zu Order und ihre Ordnung Linien beschränken, und haben keinen Zusammenhang zwischen Order und Customer.

Nicht eine formale Verbindung zwischen Order und Customer bedeutet nicht, dass wir sie gar nicht beziehen können, aber wir brauchen explizite Dienste gibt uns alle Aufträge für einen bestimmten Kunden. Wir können nicht nur navigate von einem zum anderen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top