Frage

Wir arbeiten an einem neues Projekt (Umschreiben bestehende app), und ich bin mit Problemen mit meinem Domain-Modell / Repository-Design.

Hier ist eine (vereinfachte) Version von zwei Schlüsselteilen in unserem Domain-Modell:

alt text

Wie Sie sehen können, habe ich ein abstraktes Konzept eines Post , die Dinge wie eine Bewertung sein kann, ein Gespräch, ein Foto, ein Video, usw. Beiträge können auch Kommentare haben.

Ich habe auch ein abstraktes Konzept eines Standort , das sind natürlich Dinge wie Straßen, Städte, Gemeinden, etc.

Nun, dies natürlich zu mir aussieht, als zwei klare Aggregate Wurzeln.

Also habe ich erstellt zwei Repositories, eine namens PostRepository , und rief eine andere LocationRepository .

Das war alles gut funktioniert, kann ich jede Art von Beitrag hinzufügen / get (oder Kommentar), und fügen Sie / erhalten jede Art von Ort über eine dieser beiden Repositories.

Aber jetzt im in dem Szenario einer „Zielseite“ für eine Stadt (zum Beispiel).

Auf dieser Seite muss ich im Grunde für „alle Beiträge für diesen Ort.“

Wie ist das definiert? Nun, ein Beitrag kann (optional) sein an einem Ort markiert. Implementierungsdetail, so will ich nicht gehen tief in den Daten (wie das ist nicht das, was DDD über ist), aber im Wesentlichen gibt es Geospatial Intelligence auszuarbeiten, die Beiträge in einer bestimmten Position enthalten sind, durch die Form-Datei der Lage, und die Breite / Länge der markierten Post.

Aber wie kann ich diese Informationen abrufen, ohne die Grenzen zu überqueren?

Welche Repository verwende ich? Brauche ich einen neuen?

Wenn es (oder für Neugierige) zählt, das ist eine Web-Anwendung (ASP.NET MVC), mit einer SQL Server 2008-Datenbank und Entity Framework 4.0.

Wenn Sie weitere Erläuterungen benötigen, lassen Sie es mich wissen.

Bearbeiten

Wir haben im Moment eine modifizierte Version der Spezifikation Muster verwenden, um Domänenmodelle abrufen.

Zum Beispiel ist dies der Code in unserem BLL alle wo Score> = 4 Rezension abzurufen:

var reviews = postRepository // GenericRepository<Post>
      .Find() // IQueryable<Post>
      .OfType<Review>() // IQueryable<Review>
      .Where(x => x.Score >= 4)
      .ToList(); // List<Review>

Aber jetzt brauche ich einige Code wie folgt:

var reviews = postRepository
    .Find()
    .OfType<Review>()
    .Where( //lat long, or Locations FK )
    .ToList();

Das Problem ist, ich weiß nicht, wie die obige Abfrage zu tun, ohne einen Vermittlers Hinzufügen Mitmach Entität (LocationPost - wie es viele zu viele sind)., Und fügen Sie einen FK das Post-Domain-Modell, dass

Aber das zu tun, ich bin die aggregierten Grenzen überqueren - nicht ich

War es hilfreich?

Lösung

Ich würde Post an die Stelle zum Zeitpunkt der Erstellung binden, so dass jeder Standort für I (über ein Repository) eine Liste der zugehörigen Beiträge erhalten kann. Es würde wie folgt aussehen:

Creation:

var p = new Post(latitude, longitude);
var locations = locationRepository.FindByCoordinates(latitude, longitude);
foreach (var l in locations)
{
    l.AssociatePost(p);
}
session.Save(p);

Retrieval:

var associatedPosts = postRepository.FindByLocation(locationId);
foreach (var p in associatedPosts)
{
    Display(p);
}

Unter der Haube der Verein zwischen den Pfosten und der Lage würde als many-to-many-Tabellenbeziehung umgesetzt werden. Es gibt ein Problem mit dieser Lösung. Einen neuen Standort erfordert das Hinzufügen alle Inhalte manuell scannen und ordnen sie an den neuen Standort (falls zutreffend)

Ich hoffe, das hilft.

Andere Tipps

Warum ist das ein Problem? Laut Evans in seinem Buch sehr gut ein AR anderen AR verweisen kann. (Sie können jedoch nicht ein untergeordnetes Element in einer AR von einem anderen AR Referenz)

Auch sind Orte wirklich Aggregat Wurzeln? Die Definition eines Aggregats Wurzel ist, dass es als eine Grenze von concistency wirkt. Paßt das die Definition einer Lage? Ich würde sagen, ein Ort, ein Wertobjekt ist.

Es gibt so ziemlich zwei Lager hier in Bezug auf Repositories und AR Verbände:

Eine, die sagt, dass alle Aggregate Wurzeln werden zu geholt wird durch ihre jeweiligen Repository und ARs sollte weich Beziehungen verwenden, zB IDs zwischen ihnen

Und eine, die sagt, dass Aggregat Wurzeln sehr gut andere damit verbundene Aggregat Wurzeln holen können, und dass ein Endlager ist lediglich eine Art und Weise Aggregat Wurzeln zu finden.

Angenommen, Sie haben die Spezifikation Muster verwendet wird, könnten Sie einen Beitrag Spezifikation bauen eine Location-Objekt? Dann einfach Sie die Spezifikation zu Ihrem Beitrag Repository übergeben, und das Ergebnis zurück.

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