Aggregate-Root-Referenzen anderen Aggregatstämme

Derzeit arbeite ich viel mit DDD und ich bin vor ein problem beim laden/Betrieb auf die gesamtwirtschaftliche Wurzeln aus anderen Aggregat Wurzeln.

Für jede Aggregat-Wurzel in meinem Modell, ich habe auch ein repository. Das repository ist verantwortlich für den Umgang mit Persistenz-Operationen für die Wurzel.

Sagen, dass ich zwei Aggregat-Wurzeln, mit einigen Mitgliedern (entities und value objects).

AggregateRoot1 und AggregateRoot2.

AggregateRoot1 hat ein Unternehmen Mitglied, die Verweise AggregateRoot2.

  1. Wenn ich es lade AggregateRoot1, sollte ich laden AggregateRoot2 auch?
  2. Sollte das repository für AggregateRoot2 HIERFÜR verantwortlich sein?
  3. Wenn dem so ist, ist es okay für die Entität in AggregateRoot1 rufen Sie das repository von AggregateRoot2 zum laden?

Auch, wenn ich erstellen Sie eine Assoziation zwischen der Entität in AggregateRoot1 zu AggregateRoot2, sollte das getan werden, durch die Person oder durch das repository für AggregateRoot2?

Hoffe, dass meine Frage Sinn macht.

[BEARBEITEN]

AKTUELLE LÖSUNG

Mit Hilfe von Twith2Sugars, ich habe es mit der folgenden Lösung:

Wie beschrieben in der Frage, aggregatstamm Kinder haben, die Verweise auf andere Wurzeln. Bei der Zuweisung von root2 eines der Mitglieder der root1, das repository für root1 verantwortlich für die Erkennung dieser Veränderungen, und delegieren diese an das repository für root2.

public void SomeMethod()
{
    AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
    root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
    AggregateRoot1Repository.Update(root1);
}

public class AggregateRoot1Repository
{
    public static void Update(AggregateRoot1 root1)
    {
        //Implement some mechanism to detect changes to referenced roots
        AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
    }
}

Dies ist nur ein einfaches Beispiel, kein Gesetz von Demeter oder anderen bewährten Prinzipien/Praktiken gehören 🙂

Weitere Kommentare dankbar.

  • Persönlich kann ich sehen, ist der derzeitige Ansatz, chaotisch, und ich denke, DavidMasters84 die Lösung ist eher eine elegante Lösung. Ie halten Referenzen als id ' s und extrahieren diese Art der domain-Logik, um einen domain-service.
  • Chaotisch ist ein gutes Adjektiv für diesen Ansatz. Ich darf das sagen, weil ich ursprünglich versucht, die Umsetzung dieses Problems in der gleichen Weise, und ein Durcheinander ist das, was ich fand mich an 🙂 möchten Sie vielleicht zu Lesen hier Anregungen auch für eine ähnliche Frage: stackoverflow.com/questions/2118088/...
  • Ich höre Sie, aber nicht Repositorys, es zu verwalten, aggregieren Wurzeln, und mit einigem guten Willen, die Beziehungen zwischen den Wurzeln. Und domain-Dienste zu handhaben Verhalten, die nicht ganz Natürliche Passform in einer einzigen Einheit? Mir scheint, dass der Domain-Service verantwortlich für die Handhabung von Referenzen zwischen den Wurzeln ist der falsche Ort, wenn das Lesen der definition eines Domain Service... ich könnte falsch sein, also eine mehr gesichert argument würde geschätzt, danke.
  • Mein Vorschlag für einen domain-service gibt es nicht zum verwalten von Referenzen zwischen Aggregaten; es ist dort zum aufrufen von Funktionen, die mehr beinhaltet als eine aggregierte, d.h. "Verhaltensweisen, die nicht natürlich passen in eine Einheit". In den meisten Modellen alle Aggregate beziehen sich auf die jeweils andere in irgendeiner form im Sinne eines relationalen Datenbanken, der Punkt der Aggregate ist zu brechen diese Abhängigkeit Graphen in überschaubaren Gruppen. Wenn Sie gepflegt werden die Beziehungen zwischen allen Aggregaten in das Modell würde sich der Punkt der Aggregate.
  • Yep, das ist ziemlich viel, meine Gedanken auf Sie; auf Ihre Frage über das ausführen von Operationen zwischen der Aggregat-Wurzeln, die ich denke, ist, wo der domain-service passt. Ich denke, bald wirst du dich Fragen, wie tief hat Sie das Kaninchen-Loch geht...
  • tschmuck, ich bin nicht einverstanden mit Ihrer Lösung und Stimmen mit DavidMaster. agg1.DoSomething(agg2); funktioniert gut, wie es ist Garantie aggr1 Objekt-Integrität.
  • Wie ich gelesen habe Ihre Anregung, den Bezug zwischen agg1 und agg2 werden nur vorübergehend sein. Das repository ist verantwortlich für die persistenten Zustand und die Beziehungen zu was auch immer-Mechanismus gewählt. Also, wie würden Sie damit umgehen, dass die Beziehung zwischen aggregate1.Entity --> aggregate2. Ich muss in der Lage sein, wieder den Zustand und die Beziehung. Sind Sie sugessting, dass der Domain-Service, oder das Objekt selbst (agg1) sollte umgehen?
  • Wie kamen Sie auf mit diesem? Es scheint mir, Sie sind gefangen in den Daten Beziehungen statt der geforderten Verhalten. Wenn aggregate1 muss, um es zu ändern ist-Zustand basierend auf aggregate2, braucht er nicht zu halten aggregate2 innerhalb es eigenen Zustand ist, kann es einfach weitergegeben werden aggregate2 über eine Methode auf den Zeitpunkt, wenn die Funktionen aufgerufen werden muß. Es scheint, die meisten Menschen sind einverstanden mit meiner Lösung...

InformationsquelleAutor tschmuck | 2011-02-07
Schreibe einen Kommentar