2

Récemment, je suis en train de refactoriser mon projet DDD. Quand je regarde ma couche Repository. Je l'ai trouvé retourner IQueryable < T> dans mon référentiel. Je suis perplexe et dois-je retourner IQueryable < T> à partir d'un référentiel dans mon projet DDD dans Repository Layer? Je renvoie généralement le type IQueryable dans ma conception de référentiel. Mais aujourd'hui, j'ai trouvé une idée contraire de cela article Je ne peux pas comprendre!Dois-je retourner IQueryable <T> à partir d'un dépôt dans DDD

+0

Que devrais-je retourner dans Repository Layer? – doublnt

+0

'IEnumerable' ou' IReadOnlyList' semble plus approprié. – guillaume31

Répondre

4

Si vous renvoyez IQueryable, vous autorisez la fuite des connaissances de domaine de la couche Domaine vers les couches client. Cela augmente le risque que vos objets de domaine deviennent anémiques et que tout comportement se déplace vers d'autres couches.

Bien qu'il soit très pratique pour retourner un IQueryable et vous pensez que votre code devient plus simple, c'est juste une illusion; Lorsque le projet va se développer, votre code va transformer votre code en une grosse boule de boue, avec le code de domaine dispersé partout. Vous ne pourrez pas optimiser votre référentiel ni modifier une persistance avec une autre (c'est-à-dire de sql vers nosql).

+0

Em, et que devrais-je retourner dans 'Repository Layer'? Et j'ai trouvé l'utilisation 'Specification Patten' peut être un bon moyen. – doublnt

+0

Je ne comprends pas pourquoi cette réponse est acceptée. – jannagy02

+0

@ jannagy02 Qu'est-ce que tu ne comprends pas, plus précisément? –

1

Vous ne devriez probablement pas faire cela.

Le travail de dépôt est non seulement abstraire les détails de la persistance, mais aussi de fournir une explicit query contract définir ceux qui sont nécessaires pour traiter les commandes dans votre domaine.

Si vous ressentez le besoin de filtrer/transformer davantage ce qui est retourné depuis votre référentiel, vous avez probablement échoué à capturer une requête explicite qui devrait faire partie du contrat du référentiel. Un tel contrat permet aux clients qui interrogent d'exprimer leur intention et permet des optimisations plus faciles.

1. De nos jours, il est assez courant d'appliquer certains principes CQRS et de baser entièrement le modèle de domaine pour les requêtes. Compte tenu de ce scénario, les seules requêtes qui passeraient par le référentiel sont celles qui sont nécessaires pour traiter les commandes. Cependant, vous n'êtes pas obligé d'utiliser cette approche pour que votre référentiel puisse également répondre aux requêtes de reporting si vous le souhaitez.