Según tengo entendido, un punto principal es dividir la lógica de dominio (lógica de negocios) de la infraestructura (DB, sistema de archivos, etc.).
Esta es la base del malentendido: el propósito de DDD no es separar las cosas a lo largo de una línea dura como "esto está en el servidor SQL, por lo que no debe ser BL", el propósito de DDD es separar dominios y crear barreras entre aquellos que permiten que los elementos internos de un dominio estén completamente separados de los elementos internos de otro dominio, y que definan elementos externos compartidos entre ellos.
No piense en "estar en SQL" como la barrera BL / DL, eso no es lo que es. En cambio, piense en "este es el fin del dominio interno" como la barrera.
Cada dominio debe tener API externas que le permitan trabajar con todos los demás dominios: en el caso de la capa de almacenamiento de datos , debe tener acciones de lectura / escritura (CRUD) para los objetos de datos que almacena. Esto significa que SQL en sí no es realmente la barrera, lo son los componentes VIEW
y PROCEDURE
. Nunca debe leer directamente de la tabla: ese es el detalle de implementación que DDD nos dice que, como consumidor externo, no deberíamos preocuparnos.
Considera tu ejemplo:
Lo que me pregunto es, ¿qué sucede cuando tengo consultas muy complejas, como una consulta de cálculo de recursos materiales? En ese tipo de consulta trabajas con operaciones de conjuntos pesados, el tipo de cosas para las que SQL fue diseñado.
Esto es exactamente lo que debería estar en SQL entonces, y no es una violación de DDD. Es para lo que hicimos DDD . Con ese cálculo en SQL, eso se convierte en parte de BL / DL. Lo que debería hacer es usar una vista separada / procedimiento almacenado / lo que tenga, y mantener la lógica de negocios separada de la capa de datos, ya que esa es su API externa. De hecho, su capa de datos debe ser otra capa de dominio DDD, donde su capa de datos tiene sus propias abstracciones para trabajar con las otras capas de dominio.
Hacer estos cálculos en la infraestructura no puede suceder también, porque el patrón DDD permite cambios en la infraestructura sin cambiar la capa de dominio y sabiendo que MongoDB no tiene las mismas capacidades de, por ejemplo, SQL Server, eso no puede suceder.
Ese es otro malentendido: dice que los detalles de implementación internamente pueden cambiar sin cambiar otras capas de dominio. No dice que puede reemplazar una pieza de infraestructura completa.
Nuevamente, tenga en cuenta que DDD se trata de ocultar elementos internos con API externas bien definidas. La ubicación de esas API es una pregunta totalmente diferente, y DDD no define eso. Simplemente define que estas API existen y que nunca deberían cambiar .
DDD no está configurado para permitirle reemplazar ad-hoc MSSQL con MongoDB; esos son dos componentes de infraestructura totalmente diferentes.
En cambio, usemos una analogía para lo que DDD define: autos de gasolina versus eléctricos. Ambos vehículos tienen dos métodos completamente diferentes para crear propulsión, pero tienen los mismos API: un encendido / apagado, un acelerador / freno y ruedas para impulsar el vehículo. DDD dice que deberíamos poder reemplazar el motor (gas o eléctrico) en nuestro automóvil. No dice que podamos reemplazar el automóvil con una motocicleta, y eso es efectivamente lo que es MSSQL → MongoDB.