22

para la aplicación web (ASP.NET MVC) Estoy actualmente en desarrollo, tenemos la siguiente arquitectura en su lugar:¿A qué tipo de arquitectura se llama esto?

  • Data Access Layer: Lógica para la persistencia de datos a una db arbitraria
  • Domain: El modelo de datos
  • Service Layer: la lógica de negocio (por ejemplo, procesamiento de pedidos, gestión de cuentas, etc.)
  • Controller: Consume servicios y proporciona/recibe datos a/desde la vista
  • View: La interfaz de usuario para el usuario

En esencia, me tomó la Model y dividirlo en el DAL, Service Layer y Domain. Sentí que rellenar toda la lógica dentro del Model hizo que mi código fuera demasiado complicado. Además, sentí que me dejaba expresar mi lógica empresarial limpiamente sin hacer que el controlador hiciera demasiado trabajo.

Mi pregunta es: ¿Cómo se llama este tipo de arquitectura?

Como pregunta secundaria: ¿Este tipo de arquitectura tiene sentido? Si no, ¿estoy haciendo algo mal?

Respuesta

23

Está en el camino correcto sobre DDD en función de cómo delgada/gruesa que las capas de servicios de dominio son &. DDD dice que el conocimiento (es decir, la lógica de negocios) debe crujirse en el modelo de dominio. Mover las preocupaciones de acceso a datos a DAL está en línea con DDD, pero creo que mover la lógica de negocios a una capa de servicios no lo es. Si tiene una capa delgada de "Modelo de datos" de dominio (principalmente para entidades) y una capa de Servicios gruesa (principalmente para "lógica de negocios"), puede tener un anemic domain.

Además, técnicamente no hay "Capa de servicio" en DDD. Puede haber una "capa de aplicación", pero debe ser delgada, y solo responsable del flujo de aplicaciones/administración de las duraciones de la clase de dominio. Esto es esencialmente lo que hacen los Controladores en .NET MVC, administra el flujo de aplicaciones en el contexto de la http de la web.

Si el relleno de toda la lógica dentro del modelo hizo su código excesivamente complicado, estaría interesado en escuchar ejemplos de lo que entendemos por "demasiado complicado". Podrías modelar correctamente un dominio complejo, o hay posibilidades de que hayas recurrido a los patrones DDD para simplificar las cosas. Diría que como lo mencionaste en tu pregunta, el arco no es DDD. Me acaba de llamar "arquitectura de capas", pero eso es porque yo prefiero usar el término "nivel" Sólo cuando se habla de arco física. Sin embargo, su arquitectura lógica está en capas.

Me gusta mucho que Darin vincule al arco de cebolla en su respuesta. Me estoy convirtiendo en un gran admirador de esto, y me parece que no es exclusivo de DDD en absoluto.Si su código usa inyección de dependencia para resolver dependencias de interfaz con implementaciones en tiempo de ejecución, puede tener una forma de arco de cebolla. Por ejemplo, ¿define alguna interfaz en su DAL? ¿Las implementaciones de esas interfaces se resuelven en tiempo de ejecución?

Aquí hay un ejemplo de un arco que estoy comenzando a usar en mis nuevos proyectos. Es una combinación de cebolla + DDD:

  • API Proyecto/Estructura: interfaces, enumeraciones, clases y métodos de extensión genéricos utilizados por todas las demás capas. No necesita estar separado del dominio, pero puede.

  • Domain Proyecto/Ensamblaje: todas las entidades y lógica de negocios. Depende de API solamente. Utiliza patrones DDD como fábrica, servicio, especificación, repositorio, etc. También contiene más interfaces específicas de dominio que no están definidas en la API.

  • Impl Proyecto/Ensamblaje: implementaciones de interfaces definidas en API y Domain. Aquí es donde se implementa el EF DbContext, así como cosas como el registro, el envío de correo electrónico, etc. Todas estas implementaciones son de inyección de dependencia, por lo que técnicamente podría tener varios proyectos/ensambles Impl.

  • UI Proyecto/Ensamblaje: Este es el proyecto MVC. Los controladores consumen la superficie del dominio directamente y no pasan por una aplicación o capa de servicio. Cualquier dependencia de interfaz en fábricas, servicios, repositorios, etc., se inyecta en el dominio por el controlador utilizando MVC IoC (inyección de constructor).

Puse una capa de API en el núcleo, pero podría combinar los proyectos de API y de dominio en uno. De cualquier manera, la gran parte carnosa de la cebolla es el Dominio, y tiene estratificación interna. Por ejemplo, los Servicios pueden depender de Fábricas, que dependen de Repositorios, que dependen de Entidades.

El proyecto Impl es lo que usted ve como la piel de cebolla "Infraestructura" en el diagrama de Palermo. Está en el borde exterior junto con la IU, y no contiene ningún conocimiento específico del dominio. Sabe cómo enviar correos electrónicos, almacenar/recuperar datos usando EF, etc. Si lo desea, puede tener más de 1 de estos; por ejemplo, 1 Impl para acceso a datos, 1 Impl para tratar correo, etc.

MVC tiene los Controladores y Vistas, y se concentra en la UI y el flujo de aplicaciones web. Cualquier cosa que requiera conocimientos específicos del dominio se delega en el dominio, y las clases de dominio se inyectan en el controlador. Esto significa que cualquier interfaz inyectada por el constructor en clases de dominio se resuelve automáticamente por el contenedor IoC.

Como nota final, la programación contra las interfaces definidas en las clases API y Dominio significa que puede probar el proyecto de dominio por separado del proyecto MVC.

+0

¿Tiene algún buen ejemplo de proyectos ASP.NET MVC basados ​​en DDD? ¿O los que utilizan la arquitectura que describes? He estado tratando de leer el código de todos los proyectos ASP.NET MVC que pueda para determinar qué prácticas se están utilizando, pero es extremadamente difícil. –

+0

Me gustaría chatear sobre esto con usted antes de publicar una respuesta a su comentario: http://chat.stackoverflow.com/rooms/9000/danludwig-private-room – danludwig

+0

¡Respuesta tan interesante! No sé cómo google me ha dirigido a esta publicación anterior, pero es realmente bueno. ¿Podría escribir un artículo en Code Project sobre DDD y Onion Architecture con un ejemplo :) O ya lo ha hecho: D – Celdor

4

Puede haber diferentes nombres según el ángulo que lo mire. Entonces todavía es MVC, es solo que tu M está dividida en varias capas. También se podría llamar Multitier architecture (o arquitectura N-tier). Jeffrey Palermo también utilizó la noción de Onion architecture.

4

Dado que tiene DAL separado del modelo de dominio y también tiene la capa de servicio, parece que se dirige a DDD (diseño impulsado por dominio) aquí hay una discusión sobre tal an approach que puede ser útil saber.

+0

+1 Justo lo que estaba pensando. DDD utilizado por una aplicación MVC. Depende de cuán delgados sean los modelos (o qué tan gruesos sean los servicios). – jgauffin

20

Desde un nivel alto, lo describiría como una arquitectura en capas. Describirlo como un diseño impulsado por dominio también miraría patrones más pequeños como el agregado, el repositorio, los contextos delimitados, etc. No puedo decir solo por su descripción.

Si la capa de dominio reside en un ensamblaje/paquete que no hace referencia a cualquiera de los otros, entonces tiene el núcleo de la Onion Architecture principles, que son:

  • La aplicación está construido alrededor de un objeto independiente modelo
  • Las capas internas definen interfaces.Las capas externas implementan las interfaces
  • Dirección de acoplamiento es hacia el centro
  • Todo el código núcleo de la aplicación se puede compilar y ejecutar separada de la infraestructura

una cosa concreta que buscar es si sus referencias dataAccess dominio.

Cuestiones relacionadas