2010-09-18 9 views
9

he visto muchas implementaciones en la web de las personas que manejan sus sesiones y transacciones de NHibernate en una HttpModule.NHibernate sesión y gestión de transacciones en HttpModule

El HttpModule:

  1. crea una sesión al inicio de la solicitud
  2. envuelve toda la solicitud en una transacción
  3. confirma la transacción al final de la solicitud

Si las personas usan esta estrategia, ¿cómo manejan la siguiente situación:

  1. petición llega
  2. recuperar el objeto de base de datos
  3. actualización objeto
  4. objeto no supera la validación
  5. cambios en el objeto todavía se conservan debido a que la transacción se confirma en el HttpModule.

Parece que no hay una buena manera de deshacer la transacción en el escenario anterior. El único plan que puedo llegar a es:

  1. escribir mi validación de tal manera que está garantizado para tener éxito antes de actualizar mi objeto de dominio (me toma de la validación de mi modelo de dominio).
  2. Administrar mi transacción más cerca de mi lógica de negocio y descartar la idea de hacerlo de forma transparente en un HttpModule. (He visto bastantes publicaciones recomendar esto)

Dado que muchas personas parecen estar utilizando el enfoque HttpModule, espero que haya una tercera forma de manejar este escenario que no he pensado ?

+0

También me viene a la misma pregunta últimamente. Comienzo con NHibernate en algún proyecto. Mi enfoque final es usar Autofac para IOC y usar HttpRequestScope para sesiones. Y todas las operaciones de transacción en el nivel de repositorio de negocios. Tal vez no sea el mejor, pero funciona bien por ahora ... – Elph

+0

Validar los cambios en lugar de validar los cambios aplicados a la entidad es mucho más fácil. – Paco

+0

¿Encontró una respuesta a esto? – Rippo

Respuesta

2

Puede utilizar algún tipo de gestión de excepción global. Ahora estoy usando System.AppDomain.CurrentDomain.UnhandledException. En este controlador, deberá llamar al Transaction.Rollback(); Y también permite establecer un indicador (que también viva solo durante la solicitud actual) que le indicará si necesita confirmar su transacción o revertirla. Esto puede hacer que el código sea más claro.

Editar Alternativly puede utilizar evento de error del HttpApplication

public class HelloWorldModule : IHttpModule 
{ 
    void Init(HttpApplication application) 
    { 
     application.BeginRequest += 
      (new EventHandler(this.Application_BeginRequest)); 
     application.EndRequest += 
      (new EventHandler(this.Application_EndRequest)); 
     //this is it 
     applicaiton.Error += 
      (new EventHandler(this.Application_Error)); 
    } 
Cuestiones relacionadas