Les Services et les Dépôts en DDD (C#)
Comment Services
et Repositories
se rapportent les uns aux autres en DDD? Je veux dire, j'ai lu sur des DDD pour les 2 derniers jours, et partout où je vais, il y a toujours un Service
couche et il y a toujours un Repository
couche. Comment les différencier ou se compléter les uns les autres?
De ce que j'ai lu, n'est-ce pas le Repository
la couche responsable de la délégation des interactions entre l'application et les données?
Alors, quelle est la nécessité pour le Service
couche si c'est pour mettre en œuvre les Repository
pour interagir avec les données de toute façon, même si le Repository
probablement déjà implémente les méthodes nécessaires pour le faire?
J'apprécierais quelques lumières sur le sujet.
P. S. Ne sais pas si cela va aider, mais je travaille avec une ASP.NET MVC 2 application dans laquelle je suis en train de mettre en œuvre le modèle de Référentiel. Je viens de terminer la mise en œuvre de l'Injection de Dépendance motif (pour la première fois)...
Mise à JOUR
Bon, avec donc beaucoup de réponses, je pense que je comprends ce qu'est la différence. Ainsi, à l'examen (corrigez-moi si je me trompe):
-
Un
Repository
couche interagit avec un objet de la base de données ou de l'ORM,IEmployeeRepository
->Employee
. -
Un
Service
couche encapsule plus de fonctions complexes sur les objets retournés à partir deRepositories
, soit une ou plusieurs.
Donc, puis-je avoir une sous question. Est-il considéré comme une mauvaise pratique pour créer résumé objets à envoyer à mon point de vue? Par exemple, une AEmployee
(A
pour abstract
parce que pour moi I
signifie interface
) qui contient des propriétés de Employee
et X
ou X
?
En fait, un de plus subquestion. Si un Service
couche peut être considéré comme "à l'écoute" pour un demande-t-il besoin d'être mis en œuvre avec une interface?
- Je crois que les services peuvent regrouper plusieurs référentiels.
- Il y a une sacrée différence entre le commun populaire et d'utilisation du Référentiel et du Service (l'utilisation trouvés dans de nombreux exemples, & tutoriels) et comment Domain Driven Design définit ces. Je crois qu'il est important de comprendre les différences.
- est - il devrait y avoir un référentiel par agrégat de la racine, mais un service peut être (et sera) un travail sur plusieurs reposities, rendue possible par le motif d'unité de travail. et en passant, combien de fois puis une question comme cela sera demandé? il ya beaucoup de questions au sujet de ce sur un débordement de pile.
Vous devez vous connecter pour publier un commentaire.
Vrai, un référentiel fonctionne avec des données (ie. SQL, Webservices, etc.) mais c'est le seulement travail. Les opérations CRUD, rien de plus. Il n'y a pas de place pour la procédure stockée en fonction tations de la logique.
Le service (ou de la couche logique métier) fournit la fonctionnalité. Comment répondant à une demande d'entreprise (ie. calculer le salaire), ce que vous avez à faire.
Oh, et c'est vraiment une bonne DDD livre:
http://www.infoq.com/minibooks/domain-driven-design-quickly
Le Service va utiliser un Référentiel pour récupérer une Entité, puis appeler des méthodes sur elle (l'Entité) pour exécuter la Commande/de la tâche.
Comme un exemple concret d'un Panier d'application peuvent avoir les services suivants:
ShoppingCartService - gère un panier d'éléments à ajouter/supprimer/mettre à jour soutien, etc.
OrderService - prendre un chariot, la convertit en une commande et gère le processus de paiement etc.
chacun de ces services doit parler d'une "source de données" pour les opérations CRUD. C'est là que le modèle de Référentiel est très pratique car il fait abstraction du chargement et la sauvegarde des données vers et à partir de la source de données une base de données, des services web ou encore en mémoire cache.
Lorsque vous souhaitez créer un prototype rapide de votre application sans avoir à traiter avec l'installation de base de données, schéma, des procédures stockées, des autorisations, etc. vous pouvez créer un cache ou faux référentiel dans une affaire de minutes.
Pour l'exemple au-dessus de votre prototype pourrait commencer avec les éléments suivants:
une fois que votre prototype est prêt à passer au niveau suivant, vous pouvez mettre en œuvre ces contre une véritable base de données:
De ce que je me souvienne, le référentiel est le dernier cours avant les données. La classe de service peut agir sur les données extraites du référentiel. Le référentiel est vraiment juste pour obtenir les données à quelqu'un d'autre pour faire le travail. La couche de service peut fournir des choses telles que la logique métier que toutes les données doivent passer à travers. Il pourrait également fournir une traduction entre la logique applicative et la couche de données. Mais encore une fois, c'est exactement ce que je me souviens.
Il n'y a pas d'or, norme qui définit un service ou un référentiel. Dans mes applications, un référentiel est (comme vous dites) d'une interface dans une base de données. Un service a accès à un référentiel, mais le service expose un sous-ensemble de fonctionnalités à ses consommateurs.
Penser le référentiel de plus faible niveau. Le référentiel a pour exposer de nombreuses manières d'accéder à la base de données sous-jacente. Un service peut combiner les appels à un référentiel à un autre code qui n'a de sens qu'à un niveau de code (c'est à dire pas dans la base de données), tels que l'accès à d'autres de l'état dans l'application, ou de la validation et de la logique d'entreprise qui ne peuvent pas facilement être appliquée dans une base de données.