Estoy creando una solución RESTful de API web .NET 4.5 C # y me gustaría que alguien me diga si la solución de mi proyecto es correcta y / o acertada (¿suficiente?) Para una solución diseñada usando el diseño impulsado por dominio, por favor.
La solución se ha dividido en 6 proyectos:
- /Base
(No referenciado por nada)
El proyecto web y forma la interfaz entre la solución y el mundo exterior. Contiene los controladores de API web. Casi no contiene lógica más allá de recopilar valores de objetos de solicitud y pedir trabajo a la capa BizApi.
- /Biz.Api
(Referenciado por la base])
Proporciona los servicios de dominio y permite que el proyecto de interfaz / Base tenga acceso a los objetos de lógica de negocios de dominio en el proyecto /Biz.Domain.
- /Biz.Domain
(Referenciado por Biz.Api)
Proporciona las clases de dominio para la capa Biz.Api. Estos proporcionan métodos para manipular los datos del negocio en la memoria.
- /Dal.Db
(Referenciado por Biz.Api)
La capa de repositorio de la base de datos. Accede a las bases de datos y asigna datos devueltos en DTO internos definidos en la capa / Interfaces.
- /Dal.Services
(Referenciado por Biz.Api)
Proporciona una capa proxy a dependencias externas como servicios web y asigna sus datos devueltos a los DTO internos definidos en el proyecto / Interfaces.
- / Interfaces
(Referenciado por la mayoría de los proyectos anteriores)
Contiene las clases DTO para pasar datos alrededor de la solución y las interfaces C # para definir contratos para cosas como IoC.
fuente
Respuestas:
Esta estructura de carpetas está inspirada en el famoso diseño impulsado por el dominio de implementación libro de de Vaugh Vernon.
Solución:
├ WebService (Servicios REST residen aquí)
├ WebServiceTests
├ Aplicación (Servicios de aplicaciones residen aquí)
├ ApplicationTests
├ dominio (Entidades, VO, los servicios de dominio, fábricas de dominio, las especificaciones, los acontecimientos de dominio, interfaces de Repositorios, infraestructuras de servicios interfaces)
DomainTests ├
├ Infraestructura (repositorios, servicios de infraestructura impl., Adaptadores a servicios externos)
└ Pruebas de infraestructura
Comienzo con una solución, luego creo cuatro proyectos para cada capa en mi aplicación y luego otros cuatro proyectos para cada prueba de capa.
No cree una carpeta
interfaces
oservices
en su capa de dominio, en cambio, las clases relacionadas deben agruparse por funcionalidad en los módulos.fuente
En cuanto a la estructura, me parece bien, aunque habría creado nombres diferentes y más autodescriptivos, como en
"YourProjectWebApi"
lugar de"Base"
, en"Dal.External"
lugar de"Dal.Services"
etc.Sin embargo, puede haber un olor en la parte del "DTO interno", ya que se supone que debes sacar las entidades de los repositorios y poder tomar acciones de dominio (negocios) directamente sobre ellas. Las entidades no son solo DTO's.
De alguna manera deduzco el hecho de que
Dal.Db
no depende deBiz.Domain,
que la capa de Dominio esté haciendo un mapeo entre los DTO del proyecto Interfaces (¿devuelto por los Repositorios?) Y sus propios objetos de Dominio. Esto no sería correcto en una arquitectura DDD de vanguardia (== "cebolla" o "hexagonal") típica: la capa de dominio no debería hacer referencia a otros proyectos. Por la misma razón, las interfaces del repositorio deben declararse en el dominio y no en elInterfaces
que supongo.fuente