Primero, algunos antecedentes: soy nuevo en ASP.NET MVC 2 y NHibernate. Estoy comenzando mi primera aplicación y quiero usar NHibernate, porque vengo de las aplicaciones web JSP + Struts 1 + Hibernate.Cuándo realizar transacciones NHibernate en la aplicación ASP.NET MVC 2?
Nadie parece estar hablando de esto, así que supongo que debe ser bastante obvio. Todavía me rasco la cabeza porque no puedo encontrar una solución que logre lo siguiente:
1) Quiero utilizar la estrategia de "sesión por solicitud". Por lo tanto, cada vez que un usuario realiza una solicitud, obtiene una sesión de Nhibernate, inicia una transacción y, cuando finaliza la solicitud, la transacción se compromete y la sesión de NHibernate se cierra (y regresa al grupo si hay una). Esto garantiza que mis transacciones sean atómicas.
2) Cuando se produce una excepción de base de datos (violación PK, violación única, lo que sea) Quiero capturar esa excepción, deshacer mi transacción y darle al usuario un mensaje explícito: si fue violación PK, entonces ese mensaje y el lo mismo con todos los errores de integridad.
Entonces, ¿cuál es mi problema? Vengo de Java World, donde utilicé un filtro para abrir la sesión, iniciar la transacción, procesar la solicitud, luego comprometer la transacción y cerrar la sesión. Esto funciona, excepto cuando se produce una excepción de base de datos, y cuando se encuentra en el filtro no hay forma de cambiar la página de destino porque la respuesta ya está confirmada.
Por lo tanto, el usuario ve la página de éxito cuando en realidad se canceló la transacción. Para evitar esto, tengo que escribir muchas comprobaciones de integridad de datos en Java para evitar todas las excepciones de integridad, porque no puedo manejarlas correctamente. Esto es malo porque estoy haciendo el trabajo en lugar de dejarlo en la base de datos (¿o quizás estoy equivocado y siempre tengo que escribir todo este código de integridad de datos en mi aplicación?).
Así que he encontrado la interfaz IHttpModule, que supongo que es más o menos el mismo concepto que un javax.servlet.Filter (corríjame si me equivoco), así que supongo que podría tener el mismo problema de nuevo.
¿Dónde debo poner mis confirmaciones para asegurarme de que mis transacciones son atómicas y cuando arrojan excepciones puedo capturarlas, cambiar mi página de destino y darle al usuario un mensaje completo?
Hasta ahora, la única solución posible que he encontrado es mantener mi IHttpModule para iniciar y cerrar la transacción, y poner las llamadas de confirmación en la última línea de mis métodos de control, pudiendo así capturar excepciones allí y luego devuelve una vista apropiada con el mensaje. Ahora tendría que copiar esas líneas de confirmación y manejo de excepciones en todos mis métodos de controlador que requieren confirmaciones. Y está la cuestión de la separación de las preocupaciones, que mis controladores tienen que saber sobre DB, que no me gusta para nada.
¿Hay una manera mejor?
¿Puedes mostrar un ejemplo en el código? Eso sería útil. –