Je sais que la logique de domaine doit être placée dans les objets de domaine. Mais que faire si ma logique de domaine a besoin de données de la base de données? (par exemple, vérifier la valeur unique, les valeurs calculées, etc.) Je pense que l'injection de dépôts dans les objets de mon domaine n'est pas la bonne chose. De plus, la couche de service ne doit pas contenir de règles métier. Alors, comment résoudre ce genre de logique métier?Où mettre la logique de domaine qui doit extraire des données de la base de données
Répondre
Vous avez raison votre objet domaine ne doit pas lire les données directement à partir de la base de données. L'erreur classique ici est que l'objet domaine est envoyé sur un service Web et essaie de lire les données de la base de données, lorsqu'il se trouve sur un serveur sans accès à la base de données.
Il y a plusieurs façons de le faire:
- une couche de service précontraintes toute l'information que l'objet de domaine aura besoin
- l'objet de domaine peut appeler une aide ou un dépôt qui obtient les données de la base de données
J'ai toujours trouvé la couche de service pour être un endroit logique pour invoquer ce type d'activité - mais comme je l'expliquerai, ce n'est pas où je mis en œuvre il, en tant que tel. Puisque le niveau de service est votre passerelle dans le domaine, vous êtes assuré que quelle que soit la demande qui initie le besoin de ces données, il devra passer par ce point pour y arriver. De plus, le fait que les services parlent à d'autres services est très propre, car ils sont spécifiquement conçus pour nécessiter un effort minimal d'invocation. Vous pouvez exposer la fonctionnalité adéquate dont vous avez besoin dans les référentiels (c'est-à-dire une méthode/un finder/une requête qui pourrait vous donner le nombre d'objets X correspondant aux critères Y) et encapsuler cela dans un appel de service pratique. Non seulement cela vous donne plus de pouvoir pour accomplir facilement des tâches au sein d'un même service, mais vous pouvez également exploiter cette fonctionnalité entre les services pour des besoins plus complexes. Je comprends le souci de mettre la logique métier dans la couche de service, mais en fonction de l'exigence, il s'agit d'une fine ligne entre la logique métier et la logique métier spécifique à l'implémentation. En écrivant un système, il y a souvent des règles qui sont implicites comme étant de la logique métier, mais qui ne correspondent pas. Les contraintes uniques sont ce que j'ai trouvé être l'exemple le plus commun. Rappelez-vous, comme tout le reste dans le dépôt, ce n'est pas une implémentation dans la couche de service, mais une abstraction de ce qui est déjà dans le domaine. Ce que je fais est de placer la "logique" elle-même dans le domaine, généralement sous la forme d'une implémentation de modèle de spécification. Puisque la logique est exécutée dans le référentiel et ne nécessite pas que la couche de service soit modifiée, je suis arrivé à accepter que cela soit complètement acceptable. Vous trouverez que les règles qui s'appliquent aux collections d'entités sont généralement les règles "amusantes". Si vous avez seulement besoin de vérifier que quelque chose est unique avec une collection dans la racine agrégée, c'est assez simple à faire.
J'ai vu des approches où l'objet de domaine a une connaissance du référentiel, et je ne suis pas personnellement un fan. Le référentiel, pour moi, est la définition de la façon dont le domaine va s'interfacer avec la couche de persistance (mais pas toujours l'implémentation). Le fait qu'une entité ait même la connaissance qu'elle a un but plus important que simplement exister complique énormément les choses.
- 1. Où dois-je mettre la logique pour obtenir l'enregistrement de la base de données?
- 2. Meilleures pratiques pour la logique de base de données dans ou hors de la base de données. Enregistrer la logique dans la base de données?
- 3. Où mettre la base de données des informations sensibles
- 4. comment extraire des données de la base de données?
- 5. Où mettre la logique de vue?
- 6. CakePHP: Où mettre la logique 'Services'
- 7. Où mettre l'accès à la base de données
- 8. Quel outil utiliser pour extraire des données de la procédure stockée de la base de données?
- 9. Implémentation des généralisations lors de la conception logique de la conception de la base de données?
- 10. Le système de balisage doit-il interagir avec la logique de données ou la logique métier?
- 11. Inline fonction SQL qui doit parfois mettre à jour la base de données
- 12. Comment extraire des données spécifiques d'une base de données?
- 13. comment extraire des données à partir de XML et mettre à jour la table de base de données
- 14. couche d'accès aux données kohana où mettre la base de données de requêtes personnalisées
- 15. Où dois-je mettre ma logique métier sans mappage à une base de données dans Symfony2?
- 16. Où est la base de données SQL?
- 17. Où placer des données dans une application qui utilise la base de données distante via l'API?
- 18. Validation des champs individuels avec AJAX - Où mettre la logique?
- 19. Qui doit faire la conception de modèle de données
- 20. La logique de base de données Google plus cercles
- 21. Réchauffer la base de données (mettre la totalité de la base de données dans le cache)
- 22. Base de données Cross Table Association Logique
- 23. Où est la base de données heroku?
- 24. Où mettre la logique métier dans DDD
- 25. Comment extraire le Char spécial de la base de données?
- 26. Planifier le travail pour extraire les données de la base de données Oracle vers la base de données SQL Server
- 27. Qui vient en premier: base de données ou logique d'application?
- 28. ASP.NET MVC 2 Où mettre la logique
- 29. Comment extraire des données de la requête AX dans la méthode de données SSRS
- 30. Formulaires de plusieurs pages et logique de base de données?
Personnellement, je préfère la deuxième approche. Un autre point important à mentionner est que le référentiel doit être extrait afin que les objets/couches du domaine ne soient pas étroitement couplés au référentiel. –