c# - Gestión de sesiones NHibernate y carga perezosa.
session lazy-loading (2)
Estoy trabajando en una aplicación similar. Estoy usando una sesión que mantengo abierta.
Cada vez que escribo en la base de datos, uso una transacción de inicio / confirmación que no cierra la sesión subyacente. La conexión a la base de datos solo está abierta por NHibernate mientras la transacción está en curso.
¿Hay alguna razón por la que necesite cerrar la sesión mientras el usuario está utilizando el formulario de forma activa?
¿Puede proporcionar más detalles sobre lo que está utilizando para administrar su sesión, patrón de repositorio, ... etc.?
Estoy teniendo un gran tiempo tratando de resolver mis problemas de gestión de sesión en NHibernate. Supongo que gran parte de mi problema se debe a la falta de conocimiento de los conceptos de IoC y AOP; Al menos eso es lo que pienso por donde Fabio Maulo me sigue dirigiendo.
De todos modos, mi problema es que tengo una aplicación de formularios para ganar que está realizando llamadas de "obtención" y vinculando el resultado a una cuadrícula. Después de la vinculación, el usuario puede realizar algún tipo de acción de "escritura" y, como resultado, la sesión se cierra después de la escritura en un intento de usar la sesión por concepto de uso. Luego, el usuario puede desplazarse a través de la cuadrícula, lo que hace que se inicie la carga lenta y ahora la sesión se ha cerrado y obtengo una excepción.
No quiero que mi vista sea consciente de mis sesiones, no quiero enviar un KillAllSessions cuando el usuario cierra el formulario. Además, un usuario puede tener múltiples formularios abiertos en un momento dado, lo que complica aún más los problemas asociados con ese método. Básicamente quiero que todo esto funcione "tras bambalinas".
Por lo tanto, mi idea hasta ahora es interceptar la carga perezosa y comprobar si la sesión está abierta y, si no volver a abrirla, obtener la información y luego volver a cerrarla. Sin embargo, por lo que puedo decir, que no es mucho, es esencialmente cómo funciona la carga perezosa de todos modos. Es interceptado por la fábrica de proxy (NHibernate.Bytecode.Castle) y luego recupera los datos utilizando la sesión. Así que necesito interceptar esa llamada y luego pasarla a la intercepción original después de volver a abrir la sesión. Así que esa es mi idea.
Mi pregunta es, en primer lugar, ¿es esta incluso la forma correcta de hacerlo? Segundo, si es que ni siquiera sé por dónde empezar. Nunca he hecho ninguna intercepción de llamadas a métodos, lo sabía en teoría pero no en la práctica. Sé que hay bibliotecas por ahí que hacen este tipo de cosas como Rhino Commons, pero quiero aprovechar esta oportunidad para aprender y ser un mejor programador. Estoy tratando de entender AOP y objetos enlazados al contexto, pero actualmente no lo estoy asimilando. ¿Podrían algunos de ustedes, por favor, ayudar a un chico?
Puedo pensar en algunas opciones:
Opción 1: mantenga abierta la sesión original mientras el usuario interactúa con los datos y confirma todos los cambios a la vez cuando termina. Esto significa que puede tener una gran cantidad de cambios no confirmados en la memoria y otros usuarios no verán los cambios pendientes.
Opción 2: Divida las operaciones en dos unidades de trabajo (UOW). UOW1 solo hace lecturas y es responsable de completar la lista. El ISession asociado con UOW1 permanece activo para permitir una carga lenta, como en un escenario de desglose. UOW2 es un nuevo ISession de corta duración que se crea para las ediciones del usuario. Cuando se confirma una edición, el objeto original se desaloja de UOW1 y UOW1 recupera una nueva copia de la base de datos.
Opción 3: volver a crear la lista después de cada edición confirma. Esta es la solución más fácil y podría ser adecuada para pequeños conjuntos de datos.