Ich habe DDD für die letzten 2 Wochen studiert, und eines der Dinge, die mir wirklich auffielen, war, wie Aggregatwurzeln andere Aggregatwurzeln enthalten können. Aggregatstammbäume werden aus dem Repository abgerufen. Enthält ein Stamm jedoch einen anderen Stammordner, hat das Repository einen Verweis auf das andere Repository und fordert es auf, den Teilstammsatz zu erstellen?DDD: Aggregatwurzeln für andere Aggregate erhalten
Antwort
Meiner Meinung nach kommt es darauf an - ich habe das gleiche Szenario und die Art, wie ich damit umgehe, ist über den ORM, den ich benutze - nHibernate.
Ich habe Mappings für alle meine Entitäten, von denen mehrere Aggregatwurzeln sind und einer dieser hat mehrere andere Aggregatwurzeln als Membervariablen. Das Repository für dieses zusammengesetzte Aggregatstammverzeichnis erfordert keine Verweise auf andere aggregierte Stammrepositorys, da nHibernate weiß, wie alle erforderlichen Daten abgerufen werden (über die Zuordnungen).
HTH
AWC
Das Repository nicht bauen, aber es speichert. Wenn Sie ddd verwenden, sollten Sie sich mit grundlegenden Persistenzmustern wie Arbeitseinheit, Identitätskarte, Lazy Load, Objektbeziehungszuordnung, Abfrageobjekt, (dynamischem) Proxy vertraut machen. (Diese Muster haben nichts mit DDD zu tun, sind aber sehr nützlich zu wissen). Das Repository ist nur eine Fassade, um die Implementierung der zuvor erwähnten Muster zu verbergen und den Datenzugriff domänenorientiert zu abstrahieren. Die meisten Leute schreiben ihre Persistenz-Infrastruktur heutzutage nicht manuell manuell, besonders wenn du ddd verwendest, möchtest du vielleicht einen orm betrachten.
Die tatsächliche Referenz mit dem Code, der die Datenbankdatensätze in ein Objekt konvertiert, befindet sich im Datamapper. Es gibt Verweise zwischen Mappingklassen in den Mappingklassen selbst oder durch eine Art Mapperfactory.
public interface IDataMapper<T>
{
T Map(IDataReader reader);
}
Sie müssen diesen Code nicht selbst implementieren, nur ein Tool, das es für Sie tut und versuchen zu verstehen, wie Teile des Codes in dem Werkzeug (ORM) arbeitet. Pure DDD ohne Orm ist fast unmöglich ohne eine gute Reihe von Tools, die Sie vor dem Schreiben einer Menge Code speichern.
@Paco: Sie liegen falsch. Repositories dienen nicht nur zum Speichern von Objekten. Wenn Sie das DDD-Buch von Eric Evan gelesen haben, würden Sie wissen, dass Repositories wie eine objektorientierte In-Memory-Darstellung von Daten sind. Sie können ein Repository-Objekt genauso verwenden wie eine Collection. Sie können Indexer zum Abrufen oder Festlegen von Objekten verwenden, Sie können die Add() -Methode zum Hinzufügen eines neuen Objekts verwenden, Sie können die Remove() -Methode zum Entfernen eines Objekts usw. verwenden
Das Repository verwendet dann die Infrastruktur zu Lesen/Schreiben von Daten von/zur Datenbank. Es kann einen DataMapper verwenden, um das Abrufen von Daten aus Ihrer relationalen Datenbank und das Mapping auf Ihre Entitäten zu vereinfachen.
Ist es Domain-Driven Design? Hast du dir das zusammengesetzte Designmuster angesehen? – philant