NHibernate gestión de sesiones en ASP.NET MVC


Actualmente estoy jugando con la clase HybridSessionBuilder que se encuentra en la publicación del blog de Jeffrey Palermo:

Http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

Usando esta clase, mi repositorio se ve así:

public class UserRepository : IUserRepository
{
    private readonly ISessionBuilder _sessionBuilder;

    public UserRepository(ISessionBuilder sessionBuilder)
    {
        _sessionBuilder = sessionBuilder;
    }

    public User GetByID(string userID)
    {
        using (ISession session = _sessionBuilder.GetSession())
        {
            return session.Get<User>(userID);
        }
    }
}

¿Es esta la mejor manera de gestionar la sesión / fábrica de NHibernate? He oído cosas sobre la Unidad de Trabajo y la creación de una sesión por solicitud web y la descarga al final. De lo que puedo decir, mi implementación actual no está haciendo nada de esto. Básicamente se basa en el Repositorio para tomar la sesión de la fábrica de sesiones y usarla para ejecutar las consultas.

¿Hay alguna dificultad para acceder a la base de datos de esta manera?

Author: Kevin Pang, 2008-12-13

5 answers

No debe envolver su ISession en una instrucción using the el punto de pasar el ISessionBuilder en el constructor del repositorio (inyección de dependencias) es que el código de llamada es responsable de controlar el ciclo de vida de la ISession. Al envolverlo en un using, Dispose () se llama a la ISession y no podrá cargar perezosamente miembros de objetos o persistirlo.

Hacemos algo similar simplemente pasando una ISession al constructor del repositorio. El código del Sr. Palermo, como yo entiéndalo, simplemente agrega la inicialización perezosa de la isesión. No creo que eso sea necesario porque ¿por qué crearías un repositorio si no lo vas a usar?

 37
Author: Jamie Ide,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-16 19:20:51

Con ASP.Net MVC desea asegurarse de que la vida útil de la sesión se mantenga durante el método de Acción en su controlador, ya que una vez que su controlador haya salido, se recopilarán todos sus datos. No estoy seguro de si este mecanismo ayudará con eso.

Es posible que desee buscar en S # arp Architechure, que es un conjunto de bibliotecas y orientación para la construcción ASP.Net Aplicación MVC usando NHibernate. http://code.google.com/p/sharp-architecture /

 10
Author: JoshBerke,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-13 00:45:41

Esta es la configuración que utilicé después de investigar esto más. Parece funcionar muy bien y no tiene ese molesto hábito de crear una ISession en solicitudes de archivos estáticos como la mayoría de las guías que hay:

Http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

 3
Author: Kevin Pang,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-07 16:01:11

No abriría ni cerraría sesiones en cada solicitud de datos a NHibernate. Yo usaría la Unidad de bibliotecas de Trabajo que muchos otros sugieren o hacer un poco más de lectura. NHForge.org está empezando y creo que hay algunas prácticas en la configuración de NHibernate para una aplicación web general.

Uno de los "oh wow que son momentos geniales" que he recibido de NHibernate fue aprovechar la perezosa carga de colecciones durante el desarrollo. Fue una buena experiencia ser capaz de no tiene que hacer todas esas uniones para mostrar datos en algún objeto asociado.

Cerrando la sesión así, el escenario anterior no sería posible.

Podría haber algo que está pasando con las transacciones también.

 1
Author: Min,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2008-12-13 05:20:17

Acabo de encontrar una solución limpia usando Unity para inyectar una sesión por solicitud:

Http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/nhibernate-sessions-in-aspnet-mvc.html

 1
Author: Giorgio Bozio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-05-16 20:01:10