web-dev-qa-db-fra.com

Comment structurer un projet Onion

Voici un exemple d'implémentation utilisant l'architecture Onion: https://www.codeproject.com/Articles/1028481/Understanding-Onion-Architecture

La page Web propose une structure de solution de:

Domain - Solution Folder
Domain.Entities - Class Library Project
Domain.Interfaces - Class Library Project
Service Interfaces - Solution Folder
Service.Interfaces - Class Library
Services - Solution Folder
Services - Class Library Project
Infrastructure - Solution Folder
Infrastructure.Data - Class Library Project
User Interface - Solution Folder
MVC - MVC Project

J'ai quelques questions:

  1. Pourquoi y a-t-il deux dossiers Solution dans la couche de service? c'est-à-dire Services et Services.Interfaces. Je pense qu'il devrait y en avoir un comme dans la couche domaine, c'est-à-dire que le dossier Domain Solution contient deux projets de bibliothèque de classe (Domain.Entities et Domain.Interfaces). Je considérerais normalement cela comme une erreur, mais j'ai vu d'autres projets structurés comme ça.

  2. Pourquoi la couche domaine et services est-elle divisée en deux projets de bibliothèque de classes (pourquoi ne pas avoir un seul projet de bibliothèque de classes dans chacun contenant des classes et des bibliothèques).

  3. Cette question indique que TOUTES les interfaces doivent être contenues dans la couche domaine. Cependant, tous les exemples de code que j'ai examinés mettent les interfaces de la couche service dans la couche service. Doivent-ils entrer dans la couche service ou la couche domaine?

7
w0051977

Il n'y a rien du tout requis de vous d'un point de vue projet/dossier pour établir une architecture Onion, bien que les couches du modèle suggèrent des endroits naturels pour mettre des limites de projet/API.

Jetez un œil à ce diagramme:

enter image description here

Jetez maintenant un œil à celui-ci:

enter image description here

À part la forme des diagrammes, remarquez-vous quelque chose d'intéressant?

La seule différence matérielle entre ces deux diagrammes est que le diagramme d'oignon ne permet l'accès à la base de données que via la couche d'accès aux données. Dans "l'architecture en couches traditionnelle, "L'interface utilisateur et la logique métier ont un accès direct à la base de données et aux autres systèmes informatiques (ce que l'auteur appelle" infrastructure "). Dans l'architecture Onion, la seule chose autorisée à accéder à la base de données sont les entités de domaine. Vous remarquerez que la majeure partie de l'interaction avec cette architecture se produit à la limite de la couche de service (l'anneau extérieur).

C'est tout ce qu'il y a à Onion Architecture, vraiment. Il n'y a rien de spécial ici, à part une séparation plus stricte entre les couches. En fait, je dirais que la façon dont Onion le fait est probablement la façon la plus courante d'exprimer les architectures logicielles du domaine commercial de nos jours. Je devrais remonter jusqu'à Winforms ou ASP.NET (qui utilisent tous les deux beaucoup de code-behind) pour trouver une architecture qui ressemble davantage à ce que cet auteur appelle "traditionnel en couches".

5
Robert Harvey

La structure de votre solution/projet n'est pas dictée par l'architecture de l'oignon. Si vous aviez une application très simple, vous pourriez avoir tout dans le même projet, même le même dossier - et avoir toujours une architecture d'oignon parfaite. Ou vous pourriez avoir 100 projets tout en conservant l'architecture de l'oignon.

L'architecture suggère des "coutures" où il est naturel de séparer le code si vous devez le placer dans des projets distincts, mais la structure affichée n'est qu'un exemple. En réalité, vous vous sépareriez en projets en fonction des considérations de dépendance et de déploiement.

1
JacquesB