6
votes

DDD - Comment puis-je éviter de franchir les limites globales ici?

Nous travaillons sur un nouveau projet (réécriture de l'application existante) et je rencontre des problèmes avec mon modèle de domaine / conception de référentiel de domaine.

Voici une version (simplifiée) de deux portions clés de notre Modèle de domaine: p>

text alt p>

Comme vous pouvez le constater, J'ai un concept abstrait d'un poteau fort>, ce qui peut être des choses comme une critique, une discussion, une photo, une vidéo, etc. Les messages peuvent également avoir des commentaires. P>

i avoir un concept abstrait d'un emplacement fort>, qui sont évidemment des choses comme des rues, des villes, des quartiers, etc. p>

Maintenant, cela me considérait naturellement comme deux racines agrégées claires. p>

J'ai donc créé deux référentiels, on a appelé Postrepository Strong>, et un autre appelé LocationRepository STRY>. P>

Tout allait bien, je peux ajouter / Obtenez n'importe quel type de message (ou commenter) et ajoutez / obtenez n'importe quel type d'emplacement via l'un de ces deux référentiels. p>

mais maintenant im dans le scénario d'une "page d'atterrissage" F Ou une ville (par exemple). P>

sur cette page, j'ai besoin de montrer essentiellement "tous les messages de cet emplacement". P>

Comment est-ce défini? Eh bien, un message peut être (éventuellement) étiqueté à un endroit. Détail de la 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 à peu près), mais il y a essentiellement une intelligence géospatiale pour savoir quels postes sont contenus dans un endroit particulier par le fichier de forme de l'emplacement, et la latitude / longitude du poste tagué. P>

Mais comment puis-je récupérer ces informations sans traverser les limites? P>

Quel référentiel dois-je utiliser? Est-ce que j'en ai besoin d'un nouveau? P>

Si cela importe (ou pour le curieux), il s'agit d'une application Web (ASP.NET MVC), avec une base de données SQL Server 2008 de la base de données et de l'entité 4.0. P >

Si vous avez besoin de clarification, faites le moi savoir. p>

edit strud> p>

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

Par exemple, cette est le code de notre BLL pour récupérer tous les examens où score> = 4: p> xxx pré>

mais maintenant j'ai besoin de code comme celui-ci: p>

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


0 commentaires

3 Réponses :


0
votes

Disons que vous utilisiez le modèle de spécification, pourriez-vous créer une spécification de poste à l'aide d'un objet de localisation? Ensuite, vous venez de transmettre la spécification à votre référentiel de poste et récupérez le résultat.


8 commentaires

Hmm, jamais entendu parler du "modèle de critère". Ou faites-vous référence au modèle de spécification? (Nous utilisons une version modifiée de celle-ci - VIA C # Expressions)


@ RPM1984 Pourriez-vous poster cette approche "modèle de spécification modifiée" sur la pâtebine / gist et laisser tomber le lien ici? Je sens quelque chose d'intéressant.


@ RPM1984: C'est pourquoi je ne pouvais pas le trouver sur Google! :) Oui, c'est ce que je voulais dire.


@Arnis L. - Bon de vous voir, aurons-nous une autre discussion de DDD chauffée? Je rigole. :) En fait, je viens de regarder une vidéo de NDC sur 7 raisons pour lesquelles les projets DDD échouent et ont soufflé mon esprit. Pas beaucoup à ce code, je n'ai pas "trouvé" itherwhere - Icollection publique FindAlt (Expression > Prédicat): Où T: Post


C'est une méthode sur le service de domaine (AKA postservices) pouvant être utilisée comme ceci: var critiques = _Postservice.findall (x => x.reviewscore> = 5); . La mise en œuvre agit sur un générique , en utilisant le prédicat sur le . Où .


@ RPM1984 Vous savez déjà - je n'aime pas cette approche. BTW, vérifiez ce que CQRS est tout à propos. Cela vous bloquera encore plus. Juste "N'essayez pas ça à la maison" (sur un vrai projet) à moins que vous ne soyez vraiment à l'aise avec elle. :) Bit.ly/3H2WAQ


@Arnis L - Merci pour les liens, oui j'en entendu parler, mais honnêtement, il est assez complet. Je pense que notre projet tombe dans la catégorie "DDD-Lite". Nous ne voulons pas vraiment séparer notre architecture dans des requêtes / commandes, quand c'est une application aussi simple en premier lieu. Je pouvais voir l'avantage dans d'autres architectures (N-Tier par exemple).


@ RPM1984 sur "DDD-LITE" Je pense que vous avez raison. @ Travail, les gars à côté de moi faire exactement la même chose. Mais je pense que c'est mieux que "Static Web modèle". Bit.ly/6FW1AK à propos de CQRS, chose est un exercice vraiment bon esprit. Lorsque vous comprenez des choses complexes, les moins complexes deviennent simples.



6
votes

Je voudrais lier la poste à l'emplacement au moment de la création afin que, pour chaque emplacement, je puisse obtenir (via un référentiel) une liste des postes associés. Il ressemblerait à ceci:

Création: xxx

récupération: xxx

sous la hotte, l'association entre Les postes et l'emplacement seraient mis en œuvre comme une relation de table nombreux à plusieurs. Il y a un problème avec cette solution: l'ajout d'un nouvel emplacement nécessite de numériser tous les messages et de les assigner au nouvel emplacement (le cas échéant).

espère que cela aide.


3 commentaires

+1, j'aime ça. Je vais essayer de tenter quand je vais au bureau et je vous ferai savoir comment je me trompe. Acclamations. :)


Je suis allé avec une version modifiée de cette solution. Votre solution globale me met dans la bonne direction, acclamations.


+1 - bonne réponse. Pour l'OP, même s'il est un peu tardif, votre modèle convient au format classique de "forum de discussion", si vous pensez à un emplacement étant le "forum" et le post étant lui-même. Vous trouverez que cela constituera un modèle très courant lorsqu'il s'agit de relations globales et de relations un à plusieurs et plusieurs à plusieurs.



9
votes

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

Aussi, les emplacements sont-ils vraiment des racines d'agrégats? La définition d'une racine globale est qu'elle agit comme une limite de la concision. Est-ce que cela correspond à la définition d'un emplacement? Je dirais qu'un emplacement est un objet de valeur.

Il y a à peu près deux camps ici concernant les référentiels et les associations AR:

Un qui dit que toutes les racines globales doivent être extraites à l'aide de leur référentiel respectif et que AR devrait utiliser des relations meubles, par exemple des identifiants entre eux

Et un qui dit que les racines agrégées peuvent très bien aller chercher d'autres racines agrégées associées et qu'un référentiel est simplement un moyen de trouver des racines agrégées.


1 commentaires

HMM, objet de valeur de point intéressé. Mais les emplacements ont toutes une identité (emplacement), et ils ont aussi une latitude / longitude, qui est également unique. Mais là encore, ils sont immuables, alors peut-être qu'ils sont des objets de valeur.