contre: strong> p>
3 Réponses :
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). P>
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. P>
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. P>
+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
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é. P>
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". P>
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)
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 i>" <- 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.