12
votes

Avantages et inconvénients des référentiels DDD

Avantages:

  • Les référentiels cachent des requêtes complexes.
  • Les méthodes de référentiel peuvent être utilisées comme limites de transaction.
  • orm peut facilement être moqué

    contre:

    • Orm Frameworks propose déjà une collection comme une interface d'objets persistants, quelle est l'intention de référentiels. Les référentiels ajoutent donc une complexité supplémentaire au système.
    • Explosion combinatoire lors de l'utilisation de méthodes de Findby. Ces méthodes peuvent être évitées avec des objets de critère, des requêtes ou des exemples d'objets. Mais pour ce faire, aucun référentiel n'est nécessaire car un orm prend déjà en charge ces moyens de trouver des objets.
    • Comme les référentiels sont une collection de racines globales (dans le sens du DDD), il faut créer et passer autour des racines globales même si seul un objet enfant est modifié.

      questions:

      • Quels avantages et inconvénients connaissez-vous?
      • Recommanderiez-vous d'utiliser des référentiels? (Pourquoi ou pourquoi pas?)

4 commentaires

Les ormes contrastés avec des référentiels n'ont pas vraiment de sens - vous utilisez Ormes pour mettre en œuvre des référentiels, non?


Pas de réponse définitive. Wiki communautaire?


Votre troisième con monde n'a pas de sens. Si vous avez besoin de manipuler un "objet enfant" seul, il devrait s'agir d'une racine globale.


Eh bien, votre premier contient ne tient pas beaucoup non plus. "ORM Frameworks Offre déjà une collection Collection comme une interface pour des objets persistants " <- un peu comme "ORMS" ORMS "ORMS d'ORMS de domaine agnostique de domaine Agnostic". Il existe des avantages évidents dans l'utilisation de référentiels spécifiques au domaine.


3 Réponses :


7
votes

Un référentiel est vraiment juste une couche d'abstraction, comme une interface. Vous l'utilisez lorsque vous souhaitez découpler votre implémentation de la persistance de données (c'est-à-dire votre base de données).

Je suppose que si vous ne voulez pas découpler votre dal, vous n'avez pas besoin d'un référentiel. Mais il y a beaucoup d'avantages à le faire, tels que la qualification.

En ce qui concerne l'explosion combinatoire de méthodes "Rechercher": En .NET, vous pouvez retourner un iquishable à la place d'un i-Inumérable et permettre au client appelant d'exécuter une requête LINQ dessus, au lieu d'utiliser une méthode de recherche. Ceci fournit une flexibilité pour le client, mais sacrifie la possibilité de fournir une interface vérificatrice bien définie. Essentiellement, vous échangez un ensemble d'avantages pour un autre.


2 commentaires

+1 en retournant un iquisable de l'irepositoire. Cela vous permet d'écrire votre logique "Rechercher" dans la couche de service / racine et de tester cette logique en se moquant d'un irpostage. En ce qui concerne les tests, la couche "référentiel" est l'endroit où je dessine la ligne entre tests d'unités et tests d'intégration - J'écris des tests d'intégration pour mes repos et qu'ils renvoient les enregistrements de Fetchall () appropriés pour un test iquérissable et des tests unitaires pour la première fois que a une logique commerciale réelle.


Au moins avec NHibernate, il faut savoir qu'il existe de grandes différences (la mise en cache et la requête de la manière est exécutée) entre appeler Linq .Où (A => A.Id == ID) et appeler isession.load (ID). Il peut être utile d'avoir un moyen iquéreux d'accéder aux données, mais n'essayez pas de tout faire avec cela, gardez à l'esprit que les ormes offrent généralement quelques façons de faire des requêtes et des opérations avancées.



8
votes

Le point principal d'un référentiel (comme dans le principe de responsabilité unique) est de résumer le concept d'obtenir des objets ayant une identité. Comme je suis devenu plus à l'aise avec DDD, je n'ai pas trouvé utile de penser à des référentiels comme étant principalement concentrés sur la persistance des données, mais plutôt comme des usines qui instancent des objets et persistent leur identité.

Lorsque vous utilisez un orj, vous devez utiliser leur API sous la forme limitée possible, ce qui vous donne une façade peut-être que c'est spécifique au domaine. Donc, quel que soit votre domaine, votre domaine voit toujours un référentiel. Le fait qu'il ait une orme de l'autre côté est un "détail de mise en œuvre".


0 commentaires

8
votes

Le référentiel apporte le modèle de domaine dans la mise au point en masquant les détails d'accès aux données derrière une interface basée sur une langue omniprésente. Lors de la conception de référentiel, vous vous concentrez sur les concepts de domaine, non sur l'accès des données. Du point de vue du DDD, l'utilisation directe d'ORM API équivaut directement à l'utilisation de SQL directement.

Voici comment référentiel peut ressembler à l'application de traitement de la commande: P>

Orders.FindSatisfying(PendingOrderSpecification pendingSpec)
Orders.FindSatisfying(ShippedOrderSpecification shippedSpec)


0 commentaires