¿Es esta una buena estructura de solución de Visual Studio para un servicio web RESTful de diseño impulsado por dominio?

15

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.

Matt W
fuente
"/Biz.Api proporciona los servicios de dominio": ¿quiere decir Servicios de aplicación? Además, los repositorios generalmente no devuelven DTO sino entidades (raíces agregadas). Y también sería bueno saber las dependencias entre estos proyectos;)
guillaume31
Sí, me refiero a los servicios de aplicaciones. Los repositorios devuelven instancias de clases que no hacen más que almacenar datos: estos datos se asignan a la instancia utilizando, en este caso, AutoMapper. La instancia devuelta no tiene métodos de manipulación, que creo que las entidades tienen.
Matt W
"estos datos se asignan": ¿entre qué y qué? ¿Qué quieres decir con "métodos de manipulación"?
guillaume31

Respuestas:

22

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 interfaceso servicesen su capa de dominio, en cambio, las clases relacionadas deben agruparse por funcionalidad en los módulos.

Songo
fuente
1

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.Dbno depende de Biz.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 el Interfacesque supongo.

guillaume31
fuente