Esto es en un entorno de aplicación web:"¡La sesión está cerrada!" - NHibernate
Una solicitud inicial puede completarse con éxito, sin embargo, cualquier solicitud adicional devuelve una respuesta de "sesión cerrada" del marco NHibernate. Estoy usando un enfoque HttpModule con el siguiente código:
public class MyHttpModule : IHttpModule
{
public void Init(HttpApplication context)
{
context.EndRequest += ApplicationEndRequest;
context.BeginRequest += ApplicationBeginRequest;
}
public void ApplicationBeginRequest(object sender, EventArgs e)
{
CurrentSessionContext.Bind(SessionFactory.Instance.OpenSession());
}
public void ApplicationEndRequest(object sender, EventArgs e)
{
ISession currentSession = CurrentSessionContext.Unbind(
SessionFactory.Instance);
currentSession.Dispose();
}
public void Dispose() { }
}
SessionFactory.Instance es mi implementación Singleton, utilizando FluentNHibernate para devolver un objeto ISessionFactory.
En mi clase de repositorio, intento utilizar la siguiente sintaxis:
public class MyObjectRepository : IMyObjectRepository
{
public MyObject GetByID(int id)
{
using (ISession session = SessionFactory.Instance.GetCurrentSession())
return session.Get<MyObject>(id);
}
}
Esto permite que el código de la aplicación que se llama como tal:
IMyObjectRepository repo = new MyObjectRepository();
MyObject obj = repo.GetByID(1);
Tengo la sospecha de que mi código repositorio tiene la culpa, pero no estoy 100% seguro de la implementación real que debería estar usando.
Encontré un problema similar en SO here. Yo también estoy usando WebSessionContext en mi implementación, sin embargo, no se proporcionó ninguna solución aparte de escribir un SessionManager personalizado. Para operaciones simples de CRUD, ¿se requiere un proveedor de sesión personalizado además de las herramientas integradas (es decir, WebSessionContext)?