C # - Diseño impulsado por el dominio - Asignación de datos no actualizados de DTO a la base de datos

c# dapper domain-driven-design entity-framework

Pregunta

Estoy diseñando la estructura del proyecto siguiendo las tecnologías de DDD artchitecture y C #. Estoy enfrentando un problema con el mapeo de DTO fuera de fecha a Modelo de dominio y persigo los datos de salida a la base de datos.

El escenario como abajo

Tengo 2 clientes distribuidos (Escritorio) obteniendo datos para el Estudiante tiene ID = 1

  1. El DTO de retorno del servidor para el Estudiante tiene ID = 1 con la siguiente información para el Cliente 1 y 2 así: Estudiante:

    • ID = 1
    • Nombre completo: John;
    • Número de teléfono: 01234;
  2. El Cliente 1 obtiene el DTO y actualiza el número de teléfono de este Estudiante a: 56789 y permite la acción de guardar ---> La base de datos ha persistido el nuevo valor del teléfono a 56789.

  3. El cliente 2 obtiene el DTO y actualiza el nombre completo de este alumno para: Peter y permite la acción de guardar ---> La base de datos ha persistido con el nuevo nombre completo: Peter y el número anterior: 01234 (comportamiento inesperado)

Causa raíz: - Cuando se realiza una acción de Guardar, el cliente devuelve el DTO modificado al Servidor y la asignación al Modelo de Dominio. El DTO mantiene el valor anterior (Número de teléfono: 01234) y asigna este valor al Modelo de dominio.


¿Me podría recomendar una forma o un patrón o una tecnología para prevenir este problema? Este punto es muy importante porque la aplicación puede tener varias personas modificadas al mismo modelo de aplicación al mismo tiempo.

Muchas gracias

Respuesta popular

Se llama un problema de concurrencia. Hay muchas maneras de lidiar con eso. Los productos de RDMS como SQL Server u Oracle, por ejemplo, tienen funciones integradas de manejo de simultaneidad que pueden ayudar (consulte la documentación del proveedor de la base de datos). Estudie y utilícelos primero, luego agregue su enfoque programático preferido. He visto lo siguiente en algunas de las aplicaciones que soporté, cada una con sus propios problemas, por lo que deberá probar qué funciona mejor para sus aplicaciones y cómo operan sus usuarios.

  • Una forma es agregar un campo para almacenar la versión del registro (marca de tiempo). Cuando un usuario guarda un registro, verifique si la versión de la base de datos del registro es <versión disponible. Para aumentar la integridad, también puede agregar comprobaciones para comparar valores antiguos con valores actuales y valores nuevos. Guarde si todo sale bien, de lo contrario, "rechace" y hágale saber al usuario.
  • Otra forma es agregar campos como marcadores de bloqueo (ID de usuario + marca de tiempo). Cuando un usuario solicita editar un registro, los indicadores de bloqueo se actualizan (con el ID del usuario + la hora actual). En la interfaz de usuario, el ID de usuario guardado "gana" el modo de edición y todos los demás usuarios obtienen el modo de solo lectura. Cuando el usuario de edición guarda (o cancela) desde la interfaz de usuario, se borran los indicadores de bloqueo y se configura el registro para que se edite una nueva solicitud. Pro: los usuarios saben cuándo un registro está bloqueado por quién y desde qué momento; Con: necesita agregar funciones para "caducar" un bloqueo, o para permitir a los usuarios "agarrar / robar" un bloqueo.
  • Por último, la solución puede ser operativa, con los usuarios agrupados para trabajar en conjunto / rango de registros preasignados (o según lo programado) sin superposiciones. Primitivo, pero funciona! Es dependiente del comportamiento del usuario, pero puede ser una solución a corto plazo mientras estás armando las funciones de manejo de simultaneidad de tu aplicación. En la mayoría de las aplicaciones que soporté, la planificación y la implementación de este enfoque terminan convirtiéndose en el SOP de los usuarios de todos modos, con la solución de concurrencia programática real que sirve como un "control de seguridad" adicional, JIC.

Hay muchas otras formas, cada una con sus propios problemas también. Pueden ser simples a sofisticados. Los patrones con nombre pueden incluir OCC, aprovisionamiento de eventos y mensajería, por ejemplo. A pesar de todo, la suposición es que al menos una solicitud puede ganar "por orden de llegada" y todas las demás solicitudes manejadas para reaccionar en consecuencia.

¡Espero que esto ayude!



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué