Question

Nous travaillons sur un nouveau projet (réécrivant application existante), et je suis en cours d'exécution dans des problèmes avec mon modèle de domaine / conception du dépôt.

Voici une version (simplifiée) des deux parties clés de notre modèle de domaine:

text alt

Comme vous pouvez le voir, j'ai un concept abstrait d'un Publier , qui peut être des choses comme un avis, une discussion, une photo, une vidéo, etc. messages peuvent également avoir des commentaires.

J'ai aussi un concept abstrait d'un Emplacement , qui sont évidemment des choses comme Les rues, les villes, les quartiers, etc.

Maintenant, cela me semblait naturellement deux racines globales claires.

Je créé deux dépôts, l'un appelé PostRepository , et un autre appelé LocationRepository .

C'était bien travailler, je peux ajouter / obtenir tout type de poste (ou un commentaire), et ajouter / obtenir tout type de localisation via l'un de ces deux référentiels.

Mais maintenant im dans le scénario d'une « page de destination » pour une ville (par exemple).

Sur cette page, je dois montrer essentiellement « tous les messages de cet endroit ».

Comment est celle définie? Eh bien, un poste peut être (le cas échéant) marquées à un emplacement. détail de mise en œuvre, donc je ne veux pas aller trop profondément dans les données (comme ce n'est pas ce que DDD est sur le point), mais essentiellement il y a l'intelligence géospatiale au travail quels postes sont contenus dans un endroit particulier par le fichier de forme de l'emplacement, et la latitude / longitude de la tagged post.

Mais comment puis-je récupérer ces informations sans avoir à traverser les frontières?

Quel référentiel dois-je utiliser? Ai-je besoin d'un nouveau?

S'il importe (ou pour les curieux), c'est une application Web (ASP.NET MVC), avec une base de données SQL Server 2008 et Entity Framework 4.0.

Si vous avez besoin d'éclaircissements, laissez-moi savoir.

EDIT

Nous utilisons actuellement une version modifiée du modèle spécification afin de récupérer les modèles de domaine.

Par exemple, voici le code dans notre BLL pour récupérer où Score> = 4 de tout Commentaire:

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

Mais maintenant j'ai besoin de code comme ceci:

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

Le problème est que je ne sais pas comment faire la requête ci-dessus sans ajouter un intermédiaire rejoindre entité (LocationPost - comme il est un beaucoup à beaucoup)., Et ajouter un FK au modèle de domaine après que

Mais en faisant cela, je traverse les limites globales - ne sont pas I

Était-ce utile?

La solution

Je lierait la poste à l'emplacement au moment de la création de telle sorte que pour chaque emplacement que je peux obtenir (par le biais d'un dépôt) une liste des postes associés. Il ressemblerait à ceci:

Création:

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

Récupération:

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

Sous le capot, l'association entre les postes et l'emplacement serait mis en œuvre plusieurs-à-plusieurs de table. Il y a un problème avec cette solution. Ajout d'un nouvel emplacement afin de balayer tous les postes et les affecter au nouvel emplacement (le cas échéant)

L'espoir qui aide.

Autres conseils

Pourquoi est-ce un problème? Selon Evans, dans son livre, un AR peut très bien faire référence à une autre AR. (Vous ne pouvez pas faire référence mais un élément enfant dans une AR d'un autre AR)

, sont également des endroits vraiment des racines globales? La définition d'une racine globale est qu'il agit comme une limite de concistency. Est-ce que répondant à la définition d'un lieu? Je dirais un emplacement est un objet de valeur.

Il y a à peu près les deux camps ici en ce qui concerne les dépôts et les associations AR:

Celui qui dit que toutes les racines globales doivent être récupérés par leur dépôt respectif, et AR devrait utiliser de relations souples, par exemple ID de entre eux

Et qui dit que les racines globales peuvent très bien aller chercher d'autres racines globales associées et qu'un dépôt est simplement un moyen de trouver des racines globales.

Disons que vous avez utilisé le modèle de spécification, pourriez-vous construire une spécification après l'aide d'un objet Lieu? Ensuite, vous passez simplement la spécification à votre poste de référentiel, et de revenir le résultat.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top