2010-12-10 7 views
0

Ich habe zwei Entitäten Publisher und SocialAccount, beide sind unabhängig und haben eine Beziehung von vielen zu vielen. Beide sind root Aggregates, jetzt kann ich kein soziales Konto über Publisher bekommen und ich möchte M zu M Beziehung zu 1 zu M konvertieren. Also habe ich eine andere Entität Registration eingeführt, die {PubID, SocID, CreateDate} hat. Jetzt gibt es 1 zu M Beziehung zwischen Publisher und Registrierung und 1 zu 1 zwischen Registrierung und SocialAccount. so Verleger habenRoot-Aggregat-Problem in domain-driven Design

Liste <Anmeldungen> _Registrations {get; set;}

Aber wenn ich Aggregat Grenzen schaffen, Publisher ist meine Wurzel und nach Aggregat Prinzip nur Aggregat Wurzel wird Bezug halten zu einem anderen Stammaggregat. Aber hier Registrierung Referenz halten.

Also verstoße ich gegen Aggregatprinzip, weil die Registrierung verbunden ist Social Account Entity.

Antwort

4

Ihre Verwendung des Aggregatkonzepts scheint falsch zu sein. Objekte in einem Aggregat können tatsächlich Referenzen auf andere Aggregate enthalten. Die Regel ist ein externes Objekt, das keinen Verweis auf etwas in einem Aggregat enthalten kann.

Auf dem Registrierungsobjekt scheinen Sie es erstellt zu haben, um einige aggregierte Aggregatbeziehungen zu vermeiden. Deshalb erstellen Sie kein Objekt. Wenn es in Ihrer Domain tatsächlich eine Registrierung gibt, erstellen Sie diese und modellieren Sie sie. Wenn es nicht in Ihrer Domäne ist, fügen Sie es nicht nur hinzu, um einen Pfad zu durchlaufen.

Nachdem Sie Registrierung hinzugefügt haben, sagen Sie, dass es keinen Verweis auf ein soziales Konto enthalten kann, da es Teil von Publisher ist. Das ist nicht die Regel, aber wichtiger, wie wurde Registrierung plötzlich Teil des Publisher-Aggregats? Nur für Verleger mit einer Registrierungssammlung?

Ein Aggregat ist eine Gruppe von Objekten, die als eine Einheit zur Erhaltung von Zustand und Invarianten behandelt werden. Das Vorhandensein einer Beziehung allein verleiht keine Mitgliedschaft in einem Aggregat.

Aber schau jetzt auf die andere Seite. Die Registrierung ist 1 zu 1 mit Social Account. Und wenn wir ein Social Account entfernen, macht es Sinn, immer noch eine Registrierung bei einem Publisher zu haben? Wenn nicht, dann ist die Registrierung wahrscheinlich tatsächlich Teil des SocialAccount-Aggregats. Deshalb erstellen wir Aggregate - um sicherzustellen, dass Objekte und ihre Beziehungen nach einer Zustandsänderung immer gültig sind. Wenn die Änderung des Status beim Entfernen eines SocialAccounts das Entfernen aller mit diesem Konto verknüpften Registrierungen umfasst, möchten wir sie in das Aggregat aufnehmen, um diese Regel zu erzwingen.

Jetzt haben Sie tatsächlich die "Aggregatregel" verletzt - Sie haben eine externe Beziehung von Publisher zu einem Objekt, Registrierung, das ist ein interner Teil des SocialAccount-Aggregats.

Diese Konzepte sind mehr als nur Regeln, sie haben Gründe. Sie müssen überprüfen, was Aggregat wirklich bedeutet, verstehen, was die Regeln tatsächlich sagen und was sie wirklich bedeuten, warum sie überhaupt existieren. Dann bewerten Sie Ihre Beziehungen neu und fassen Sie die Definitionen entsprechend zusammen.

0

Zuerst benötigen wir eine Abstraktion für das Einkapseln von Referenzen innerhalb des Modells.

Ein AGGREGATE ist ein Cluster verbundener Objekte, die wir als Einheit für Datenänderungen behandeln.

Jedes AGGREGATE hat eine Wurzel und eine Grenze.Die Grenze definiert, was innerhalb des AGGREGATE ist. Die Wurzel ist eine einzelne, spezifische ENTITY, die im AGGREGATE enthalten ist. Die Wurzel ist das einzige Mitglied von AGGREGATE, das außerhalb von Objekten Referenzen enthalten darf, obwohl Objekte innerhalb der Grenze Referenzen zueinander enthalten können. Andere Entitäten als die Wurzel haben eine lokale Identität, aber diese Identität muss nur innerhalb des AGGREGATE unterscheidbar sein, weil kein äußeres Objekt sie jemals aus dem Kontext der Wurzel ENTITY heraus sehen kann.

was denkst du darüber Sinfhus?

+0

Das ist im Wesentlichen die von Evans vorgeschlagene Gesamtdefinition. Persönlich finde ich den globalen versus lokalen Identitätsaspekt etwas verwirrend und ziehe es vor, zu betonen, dass keine anderen Referenzen als eine transiente erhalten werden und eine enthaltene Entität nur durch Traversieren über die aggregierte Wurzel zugänglich ist. – Sisyphus