Empecé a pensar en el seguimiento de los cambios en el gráfico de objeto complejo en la aplicación desconectada. Ya he encontrado varias soluciones pero me gustaría saber si hay alguna mejor práctica o qué solución usas y por qué? Pasé la misma pregunta al MSDN forum pero recibí una sola respuesta. Me gustaría tener más respuestas para aprender de la experiencia de otros desarrolladores.Cambios de seguimiento en el gráfico de objeto complejo
Esta pregunta está relacionada con .NET, por lo que para respuestas con detalles de implementación prefiero las respuestas relacionadas con el mundo .NET, pero creo que esto es lo mismo en otras plataformas.
El problema teórico en mi caso se define en la arquitectura de múltiples capas (no necesariamente de n niveles en el momento) de la siguiente manera:
- capa de repositorios utilizando ORM para hacer frente a la persistencia (herramienta ORM no lo hace por el momento, pero probablemente será Entity Framework 4.0 o NHibernate).
- Conjunto de clases puras (ignorante persistente = POCO que es equivalente a POJO en el mundo de Java) que representan objetos de dominio. Los repositorios persisten esas clases y las devuelve como resultado de consultas.
- Conjunto de servicios de dominio que trabajan con entidades de dominio.
- capa de fachada que define la puerta de enlace a la lógica de negocios. Internamente usa repositorios, servicios de dominio y objetos de dominio. Los objetos de dominio no están expuestos: cada método de fachada utiliza un conjunto de objetos de transferencia de datos especializados para el parámetro y el valor de retorno. Es responsabilidad de cada método de fachada transformar la entidad de dominio a DTO y viceversa.
- Aplicación web moderna que usa capa de fachada y DTOs - Yo llamo a esta aplicación desconectada. En general, el diseño puede cambiar en el futuro, de modo que la capa Fachada estará envuelta por la capa de servicio web y la aplicación web consumirá esa transición de servicios => a 3 niveles (web, lógica comercial, base de datos).
Supongamos ahora que uno de los objetos del dominio es el pedido que tiene detalles del pedido (líneas) y pedidos relacionados. Cuando el cliente solicita el pedido de edición, puede modificar el pedido, agregar, eliminar o modificar cualquier detalle del pedido y agregar o eliminar pedidos relacionados. Todas estas modificaciones se realizan sobre datos en el navegador web - javascript y AJAX. Por lo tanto, todos los cambios se envían en una sola toma cuando el cliente presiona el botón Guardar. La pregunta es ¿cómo manejar estos cambios? La herramienta de repositorio y ORM necesita saber qué entidades y relaciones se modificaron, insertaron o eliminaron. Terminé con dos "mejores" soluciones:
tienda estado inicial de DTO en campo oculto (en peor de los casos a la sesión). Al recibir una solicitud para guardar los cambios, cree un DTO nuevo basado en los datos recibidos y un segundo DTO basado en los Datos persistentes. Combina esos dos y rastrea los cambios. Envíe DTO fusionado a la capa de fachada y use la información recibida sobre los cambios para configurar correctamente el gráfico de entidad. Esto requiere algún seguimiento de cambio manual en el objeto de dominio para que la información de cambio pueda configurarse desde cero y luego pasar al repositorio; este es el punto con el que no estoy muy contento.
No rastrear los cambios en DTO en absoluto. Al recibir datos modificados en la capa de fachada crear entidad modificada y cargar el estado real del repositorio (generalmente consulta adicional a la base de datos, este es el punto con el que no estoy muy contento) fusionar estas dos entidades y rastrear automáticamente los cambios por entidad proxy proporcionados por la herramienta ORM (Entity framework 4.0 y NHibernate lo permiten). Se necesita cuidado especial para el manejo de concurrencia porque el estado actual no tiene que ser el estado inicial.
¿Qué opinas sobre eso?¿Que recomiendas?
Sé que algunos de estos desafíos se pueden evitar utilizando el almacenamiento en caché en algunas capas de aplicaciones, pero eso es algo que no quiero usar en este momento.
Mi interés en este tema va incluso más allá. Por ejemplo, supongamos que la aplicación va a la arquitectura de 3 niveles y que el cliente (aplicación web) no se escribirá en .NET = las clases DTO no se pueden reutilizar. Seguir los cambios en DTO será mucho más difícil porque requerirá que otro equipo de desarrollo implemente correctamente el mecanismo de seguimiento en sus herramientas de desarrollo.
Creo que estos problemas tienen que resolverse en muchas aplicaciones, por favor comparta su experiencia.
Hola, gracias por muy buena respuesta. Me gusta. Está muy cerca de mi arquitectura, excepto que en mi caso estoy usando DTO entre UI y BL y objetos/entidades de Dominio entre BL y DAL. Entiendo su explicación, el único punto que me falta es la respuesta a la pregunta principal: ¿cómo hacer un seguimiento de los cambios en el gráfico de objetos complejos? Usted recibe DTO y tiene que encontrar de alguna manera lo que ha cambiado. Si su DTO es un objeto simple, no necesita rastrearlo, pero ¿qué pasa con DTO que contiene una colección de otros DTO? Debes saber qué ha cambiado en esa colección. –
Cambios RE en el objeto Gráfico - Espero Hay patrones de diseño que manejarán esto pero no recuerdo ninguno - me viene a la mente Momento, de lo contrario tal vez sea un modelo impulsado por eventos. –
En el modelo tradicional de ASP.NET, las páginas tienden a construirse desde cero cada vez (y por lo tanto, está cargando todos los datos, independientemente de cuál sea el cambio), y si está persistiendo datos en viewstate, tiende a tratar eso como "los datos", por lo que no he estado en la posición de querer buscar cambios específicos en la forma en que está sugiriendo (?). El otro enfoque es uno basado en AJAX, pero esto es similar.El patrón del observador también podría ser de interés. –