web-dev-qa-db-fra.com

DDD, modélisant les couches d'application et de domaine sans casser la trempette

Citant Théorie DDD :

La couche d'application est mince en termes de logique de domaine - elle coordonne simplement les objets de couche de domaine pour effectuer le travail réel.

En ce qui concerne la modularisation, et en supposant que le module contenant les entités de domaine et les interfaces des services de domaine appartiennent à la couche de domaine, la couche d'application dépend de la couche de domaine, qui brise le principe d'inversion de dépendance .

La mise en œuvre de l'interface du composant de haut niveau par la composante basse niveau nécessite que le package de composants de bas niveau dépend de la composante de haut niveau pour la compilation, inversant ainsi la relation de dépendance classique.

Qu'est-ce que je rate?

J'ajoute un diagramme UML pour clarifier le problème que je vois. enter image description here

  • La couche de persistance dépend d'une abstration de la couche de domaine -> DIP OK!
  • La couche d'application dépend d'une abstraction dans la couche de domaine -> Est-ce que cela enfreint la trempette?
5
diegomtassis

Le principe d'inversion de dépendance a une exception majeure: à un moment donné, vous devez faire quelque chose de concret. Un exemple est en ordre.

Disons que vous avez une application de blogging. Vous avez deux tables dans la base de données et deux modèles de domaine, disons Blog et Post. Disons également que vous travaillez avec un cadre MVC comme ASP.NET MVC, Ruby sur rails, etc.

Maintenant, disons que vous avez une autre classe appelée BlogPostsController Mise en œuvre des opérations de crud de base pour les poteaux de blog.

Le cadre implémente le principe d'inversion de dépendance par code non dur des lignes suivantes Annywherefhere dans sa base de code:

new BlogPostsController();

Le cadre examine l'URL entrante et construit le nom de la classe du contrôleur de manière dynamique. Le cadre n'a pas de dépendance difficile sur votre classe BlogPostsController.

Maintenant, regardons le contrôleur. À l'intérieur de votre contrôleur, vous voyez new Post() poivré partout. Ceci est non une violation du principe d'inversion de dépendance, car à un moment donné, en tant que programmeur, devez économiser un article de blog sur la base de données.

Le principe d'inversion de dépendance concerne principalement des dépendances qui ne sont pas axées au laser sur l'intention de base d'une classe, car la création d'un nouveau "contrôleur" dans un cadre MVC. Vous ne voulez pas de codé dur switch ou if instruction afin de le faire. L'authentification est une autre zone où la plongée est importante car votre classe BlogPostsController _ Classe ne devrait pas veiller à ce que les cookies de navigateur soient manipulés ou si l'utilisateur se connecte à l'aide d'une page de connexion personnalisée câblée dans une base de données ou à l'aide de l'authentification Windows ou du texte brut. Authentification dans le navigateur câblé au LDAP dans les coulisses.

1
Greg Burghardt

Ne peut pas encore commenter, alors nous allons ici: votre malentendu devient très évident si vous regardez des graphiques d'une "architecture hexagonale". Essentiellement DDD veut juste que toutes vos dépendances Sourcecode pointent sur "Infrofilcles" dans votre noyau d'application, dans votre domaine.

L'architecture que vous avez exposée ne violait pas ce principe. Vous utilisez simplement la trempette pour faire basculer la persistance et l'application des couches, évitant la dépendance à pointer "vers le bas".

0
winson