El problema al que me enfrento continuamente es cómo lidiar con los valores calculados impulsados por la lógica de dominio mientras se trabaja de manera eficiente contra el almacén de datos.
Ejemplo:
Estoy devolviendo una lista de Productos de mi repositorio a través de un servicio. Esta lista está limitada por la información de paginación de la solicitud DTO enviada por el cliente. Además, el DTO especifica un parámetro de clasificación (una enumeración amigable para el cliente).
En un escenario simple, todo funciona muy bien: el servicio envía expresiones de paginación y clasificación al repositorio y el repositorio emite una consulta eficiente a la base de datos.
Sin embargo, todo se rompe cuando necesito ordenar los valores generados en la memoria de mi modelo de dominio. Por ejemplo, la clase Product tiene un método IsExpired () que devuelve un bool basado en la lógica empresarial. Ahora no puedo ordenar y buscar en el nivel de repositorio: todo se habría hecho en la memoria (ineficiente) y mi servicio tendría que saber las complejidades de cuándo emitir estos parámetros al repositorio y cuándo realizar la clasificación / paginación sí mismo.
El único patrón que parece tener sentido para mí es almacenar el estado de la entidad en la base de datos (hacer IsExpired () un campo de solo lectura y actualizarlo a través de la lógica de dominio antes de guardar). Si separo esta lógica en un repositorio separado "leer modelo / dto" y "informar", estoy haciendo que mi modelo sea más anémico de lo que me gustaría.
Por cierto, cada ejemplo que he visto para cálculos como este realmente parece apoyarse en el procesamiento en memoria y pasar por alto el hecho de que es mucho menos eficiente a largo plazo. Tal vez estoy optimizando prematuramente, pero eso no me sienta bien.
Me encantaría saber cómo otros han lidiado con esto, ya que estoy seguro de que es común en casi proyectos que involucran DDD.
fuente
Supongo que cuestionaría cuál es la lógica de negocios que determina si isExpired es verdadero o no. ¿Puede esta lógica ser realizada por una consulta tal como está el modelo de datos? Si es así, ¿puede hacer que su repositorio sea lo suficientemente inteligente como para usar la lógica "isExpired" cuando solicita productos de cierta manera? Si no, tal vez necesite volver a examinar su modelo de datos.
DDD no significa que sus repositorios deben ser estúpidos, solo significa que su dominio necesita saber cómo comunicarse con sus repositorios.
fuente