2009-10-29 7 views
1

Avis de non-responsabilité: Je suis assez nouveau à DDD et à sa terminologie associée, donc si j'étiquette les concepts, veuillez me corriger.Un référentiel doit-il être responsable de "l'aplatissement" d'un domaine?

Je travaille actuellement sur un site avec un modèle de domaine relativement simple (articles de catalogue, chacun stocke une collection d'objets CatalogImage.)

Mon référentiel suit l'interface standard de FindbyID(int ID)GetAll() etc ...

Le problème se pose lorsque vous essayez de trouver une image particulière par son ID; Je finis avec des méthodes telles que FindImagebyID(int CatalogItemID, int ImgID)

Comme nouveaux requirments se développent, et le graphe d'objet devient plus fortement imbriquées, je pouvais voir une explosion de méthodes telles que Find{NestedType}ByID(int catalogItemID,.....,int nestedTypeID)

Au cas où je rentrais simplement un IEnumerable du FindAll() méthode, et en utilisant Linq dans une couche supérieure pour former ces requêtes? Ou est-ce que ce sera une violation de SoC?

Répondre

2

Il me semble que vous avez une justification pour construire plusieurs référentiels.

Exemple

interface CatalogRepository 
{ 
    Catalog FindByID(int ID); 
} 

interface CatalogImageRepository 
{ 
    CatalogImage FindByID(int ID); 
} 

Cela sépare correctement vos préoccupations, puisque chaque dépôt est seul responsable de savoir comment faire face à cette entité spécifique.

+0

En fait, je suis d'accord avec votre réponse, je me demande simplement si l'entité/le modèle est simplement grand? – CSharpAtl

+0

J'aime l'approche générale, mais comment la méthode FindByID de CatalogImageRepository connaitrait-elle l'élément de catalogue auquel l'image est associée? – gn22

+0

@CSharpAtl Je ne suis pas sûr si c'est une question de la taille du modèle. Je pense que c'est plus une question de comment le PO prévoit d'interroger le DAL. Si cela va toujours être interrogé de la même manière (c'est-à-dire FindById, etc.), alors je pense qu'il va bien continuer son chemin. Cependant, s'il commence à aller dans le sens de l'interrogation dynamique, je pense que l'implémentation de la commande de requête de séparation pourrait être une meilleure solution, mais la conception entière devrait être modifiée dans ce cas. – Joseph

0

Je voudrais filtrer le modèle à une couche au-dessus du référentiel, avec LINQ si vous le souhaitez. Rend le référentiel simple. Si vous utilisez LINQ pour obtenir les données de la base de données, cette méthode fonctionne très bien, si vous devez utiliser ADO ou une autre couche d'accès aux données héritées, cela peut rendre plus difficile la simplification du référentiel. Linq le rend facile pour que le référentiel renvoie IQueryable et laisse la couche suivante ajouter le filtrage et la récupération réelle des données ne se fait pas jusqu'à ce qu'on le demande. Cela permet d'avoir une méthode sur le dépôt comme GetImages() qui obtient toutes les images, et la couche suivante ajoute le filtrage pour une image spécifique. Si vous utilisez ADO, vous n'aurez probablement pas envie de ramener toutes les images puis de les filtrer .... donc cela pourrait être un compromis.