Je crée une solution RESTful d'API Web CNET .NET 4.5 et j'aimerais que quelqu'un me dise si la solution de mon projet est correcte et/ou judicieuse (-assez?) Pour une solution conçue à l'aide de Domain Driven Design, s'il vous plaît.
La solution a été divisée en 6 projets:
(Pas référencé par quoi que ce soit)
Le projet web et forme l'interface entre la solution et le monde extérieur. Contient les contrôleurs d'API Web. Ne contient presque aucune logique au-delà de la collecte de valeurs à partir des objets de demande et de la demande de travail à la couche BizApi.
(Référencé par Base])
Fournit les services de domaine et permet au projet d'interface/Base d'avoir accès aux objets de logique métier de domaine dans le projet /Biz.Domain.
(Référencé par Biz.Api)
Fournit les classes de domaine pour la couche Biz.Api. Ceux-ci fournissent des méthodes pour manipuler les données de l'entreprise en mémoire.
(Référencé par Biz.Api)
Couche de référentiel de base de données. Accède aux bases de données et mappe les données retournées dans les DTO internes définis dans la couche/Interfaces.
(Référencé par Biz.Api)
Fournit une couche proxy aux dépendances externes telles que les services Web et mappe leurs données retournées aux DTO internes définis dans le projet/Interfaces.
(Référencé par la plupart des projets ci-dessus)
Contient les classes DTO pour transmettre des données autour de la solution et les interfaces C # pour définir des contrats pour des choses comme l'IoC.
Cette structure de dossiers est inspirée du célèbre livre Implémentation de la conception pilotée par domaine de Vaugh Vernon.
Solution:
├ WebService (Les services REST résident ici)
├ WebServiceTests
├ Application (Les services d'application résident ici)
├ ApplicationTests
├ Domaine (Entités, VO, services de domaine, usines de domaine, spécifications, événements de domaine, interfaces de référentiels, interfaces de services d'infrastructures)
├ DomainTests
├ Infrastructure (Référentiels, Services d'infrastructure impl., Adaptateurs aux services externes)
└ InfrastructureTests
Je commence par une solution, puis je crée quatre projets pour chaque couche de mon application, puis quatre autres projets pour chaque couche.
Ne créez pas de dossier interfaces
ou services
dans votre couche de domaine, mais les classes liées doivent être regroupées par fonctionnalité dans les modules.
En ce qui concerne la structure, cela me semble OK même si j'aurais trouvé des noms différents et plus auto-descriptifs, tels que "YourProjectWebApi"
au lieu de "Base"
, "Dal.External"
au lieu de "Dal.Services"
etc.
Cependant, il peut y avoir une odeur dans la partie "DTO interne", car vous êtes censé retirer les entités des référentiels et être en mesure de prendre des actions de domaine (métier) directement sur elles. Les entités ne sont pas seulement des DTO.
Je comprends en quelque sorte le fait que Dal.Db
n'a aucune dépendance à Biz.Domain,
que la couche Domain effectue un mappage entre les DTO du projet Interfaces (renvoyés par les référentiels?) et ses propres objets Domain. Cela ne serait pas correct dans une architecture DDD de pointe typique (== "oignon" ou "hexagonal") - la couche Domaine ne devrait pas référencer d'autres projets. Pour la même raison, les interfaces de référentiel doivent être déclarées dans le domaine et non dans Interfaces
comme je suppose qu'elles le sont.