Estoy (re) diseñando una aplicación a gran escala, utilizamos una arquitectura multicapa basada en DDD.
Tenemos MVC con capa de datos (implementación de repositorios), capa de dominio (definición de modelo de dominio e interfaces - repositorios, servicios, unidad de trabajo), capa de servicio (implementación de servicios). Hasta ahora, usamos modelos de dominio (en su mayoría entidades) en todas las capas, y usamos DTO solo como modelos de vista (en el controlador, el servicio devuelve modelos de dominio y el controlador crea el modelo de vista, que se pasa a la vista).
He leído innumerables artículos sobre el uso, no uso, mapeo y paso de DTO. Entiendo que no hay una respuesta definitiva, pero no estoy seguro de si está bien o no devolver los modelos de dominio de los servicios a los controladores. Si devuelvo el modelo de dominio, todavía nunca se pasa a la vista, ya que el controlador siempre crea un modelo de vista específico de la vista; en este caso, parece legítimo. Por otro lado, no se siente bien cuando el modelo de dominio abandona la capa empresarial (capa de servicio). A veces, el servicio debe devolver el objeto de datos que no se definió en el dominio y luego tenemos que agregar un nuevo objeto al dominio que no está asignado o crear un objeto POCO (esto es feo, ya que algunos servicios devuelven modelos de dominio, algunos efectivamente devolver DTO).
La pregunta es: si usamos estrictamente modelos de vista, ¿está bien devolver los modelos de dominio a los controladores, o deberíamos usar siempre DTO para la comunicación con la capa de servicio? Si es así, ¿está bien ajustar los modelos de dominio en función de qué servicios necesitan? (Francamente, no lo creo, ya que los servicios deberían consumir lo que tiene el dominio). Si debemos apegarnos estrictamente a los DTO, ¿deberían definirse en la capa de servicio? (Creo que sí). A veces está claro que deberíamos usar DTO (por ejemplo, cuando el servicio realiza mucha lógica de negocios y crea nuevos objetos), a veces está claro que deberíamos usar solo modelos de dominio (por ejemplo, cuando el servicio de Membresía devuelve Usuario anémico ( s), parece que no tendría mucho sentido crear DTO que sea lo mismo que el modelo de dominio), pero prefiero la coherencia y las buenas prácticas.
Article Domain vs DTO vs ViewModel - ¿Cómo y cuándo usarlos? (y también algunos otros artículos) es muy similar a mi problema, pero no responde a esta (s) pregunta (s). Artículo ¿Debo implementar DTO en el patrón de repositorio con EF? también es similar, pero no trata con DDD.
Descargo de responsabilidad: no tengo la intención de usar ningún patrón de diseño solo porque existe y es elegante, por otro lado, me gustaría usar buenos patrones de diseño y prácticas también porque ayuda a diseñar la aplicación en su conjunto, ayuda con la separación De preocupación, incluso si usar un patrón particular no es "necesario", al menos por el momento.
Como siempre, gracias.