Mi empresa está reescribiendo nuestra aplicación web desde cero. Es una gran aplicación de nivel empresarial con un dominio complejo en la industria financiera.
Estamos utilizando un ORM (Entity framework) para la persistencia.
En esencia, la mitad de nuestra aplicación se centra en recopilar datos sin procesar del usuario, almacenarlos, y luego la otra mitad de la aplicación que contiene la mayor parte de nuestra lógica de dominio real toma esos datos en bruto para crear nuestra imagen de dominio que difiere mucho de los originales entradas sin procesar, y las pasa a un motor de cálculo, ejecuta cálculos y escupe resultados, que luego se muestran al usuario.
En un enfoque DDD que usa capas, parece que las operaciones CRUD pasan por la capa de dominio. pero al menos en nuestro caso, esto no parece tener sentido.
Cuando un usuario va a la pantalla de edición para cambiar una cuenta de inversión, por ejemplo, los campos en la pantalla son los campos exactos almacenados en la base de datos, no la representación de dominio utilizada más tarde para los cálculos. Entonces, ¿por qué cargaría la representación de dominio de la cuenta de inversión cuando la pantalla de edición necesita la representación de la base de datos (entradas sin formato)?
Después de que el usuario hace clic en "Listo" en la pantalla de la cuenta de inversión, y se realiza una POST al controlador, el controlador ahora tiene una representación de la base de datos de la cuenta de inversión que necesita guardar. Pero por alguna razón, ¿se supone que debo cargar la representación del dominio para realizar modificaciones en lugar de simplemente asignar el modelo del controlador directamente al modelo de la base de datos (modelo de marco de la entidad)?
Entonces, en esencia, estoy asignando un modelo de datos al modelo de dominio, solo para que luego pueda asignarse nuevamente al modelo de datos para persistir. ¿Cómo eso tiene sentido?
Respuesta corta: no lo hace .
Respuesta más larga: los patrones pesados para desarrollar un modelo de dominio no se aplican a aquellas partes de su solución que son solo una base de datos.
Udi Dahan tuvo una observación interesante que puede ayudar a aclarar esto
El objetivo del modelo de dominio, después de todo, es garantizar que todas las actualizaciones de los datos mantengan la invariabilidad comercial actual. O, para decirlo de otra manera, el modelo de dominio es responsable de garantizar que la base de datos que actúa como sistema de registro sea correcta.
Cuando se trata de un sistema CRUD, generalmente no es el sistema de registro de los datos. El mundo real es el libro de registro, y su base de datos es solo una representación local almacenada en caché del mundo real.
Por ejemplo, la mayoría de la información que aparece en un perfil de usuario, como una dirección de correo electrónico o un número de identificación emitido por el gobierno, tiene una fuente de verdad que se encuentra fuera de su negocio: es el administrador de correo de otra persona quien asigna y revoca direcciones de correo electrónico, no tu aplicación Es el gobierno el que asigna los SSN, no su aplicación.
Por lo tanto, normalmente no va a realizar ninguna validación de dominio en los datos que le llegan del mundo exterior; es posible que tenga los controles establecidos para asegurar que los datos está bien formado y debidamente desinfectado ; pero no son sus datos: su modelo de dominio no obtiene un veto.
Eso es correcto para el caso donde la base de datos es el libro de registro .
Ouarzy lo puso de esta manera .
Usamos el modelo de dominio para administrar los datos que pertenecen al dominio; los datos de fuera del dominio ya se administran en otro lugar, solo estamos almacenando una copia en caché.
Greg Young utiliza los sistemas de almacén como una ilustración principal de soluciones donde el libro de registro está en otro lugar (es decir, el piso del almacén). La implementación que describe es muy parecida a la suya: una base de datos lógica para capturar los mensajes recibidos del almacén y luego una base de datos lógica separada que almacena en caché las conclusiones extraídas del análisis de esos mensajes.
Tal vez. Sería reacio a etiquetarlo como un contexto limitado, porque no está claro qué otro equipaje viene con él. Puede ser que tenga dos contextos, puede ser uno con diferencias sutiles en el lenguaje ubicuo que aún no ha aprendido.
Posible prueba de fuego: cuántos expertos en dominio necesita dos expertos en dominio para cubrir este espectro, o solo uno que hable sobre los componentes de diferentes maneras. Básicamente, puede adivinar cuántos contextos limitados tiene trabajando la ley de Conway al revés.
Si considera que los contextos limitados están alineados con los servicios, puede ser más fácil: ¿debería poder implementar estas dos funciones de manera independiente? Sí sugiere dos contextos limitados; pero si necesitan mantenerse sincronizados, entonces tal vez sea solo uno.
fuente
En su dominio, no debería tener que saber que la base de datos incluso existe.
Su dominio se trata de reglas comerciales. Lo que necesita para sobrevivir cuando la empresa que creó su base de datos se cierra. Es decir, si quiere que su empresa sobreviva. Es realmente agradable cuando a esas reglas no les importa que hayas cambiado la forma en que persistes los datos.
Los detalles de la base de datos existen y deben tratarse. Deberían vivir en otro lugar. Ponlos a través de un límite. Controle cuidadosamente cómo se comunica a través de ese límite o no es un límite.
El tío Bob tiene esto que decir sobre en qué poner sus datos:
También explica cómo sus capas externas deben ser complementos de sus capas internas para que las capas internas ni siquiera sepan que existen capas externas.
Siga algo así y tendrá un buen lugar para ignorar la base de datos donde puede preocuparse por las reglas de validación de entrada, las reglas de entrada deben persistirse de alguna manera, las reglas para ejecutar cálculos, las reglas para enviar esos resultados a cualquier salida. En realidad, es más fácil leer este tipo de código.
Es eso o decides que tu dominio es realmente solo para manipular la base de datos. En ese caso, su idioma de dominio es SQL. Si es así, pero no esperes que tu implementación de las reglas comerciales sobreviva a un cambio de persistencia. Terminarás necesitando reescribirlos por completo.
fuente
Aplicando la teoría DDD:
Hay dos contextos limitados en ese dominio:
Cada contexto limitado puede tener un diseño arquitectónico diferente.
Ejemplo:
La cuenta de inversión del cliente es una entidad (quizás un agregado, depende del dominio) y la persistencia de los datos se realiza a través del repositorio de la entidad (RDB u otro tipo de base de datos como una base de datos OO).
No existe un enfoque DDD para las operaciones CRUD. Tener un campo de base de datos vinculado a los datos de un objeto rompe los principios de diseño.
fuente