2008-12-13 12 views
28

Actualmente estoy jugando con la clase HybridSessionBuilder encontrado en el blog de Jeffrey Palermo:NHibernate gestión de sesiones en ASP.NET MVC

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

El uso de esta clase, mi repositorio es el siguiente:

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 escuchado cosas sobre Unit of Work y la creación de una sesión por solicitud web y la limpieza al final. Por 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 la sesión y usarla para ejecutar las consultas.

¿Hay algún error al hacer acceso a la base de datos de esta manera?

+1

no está seguro acerca de las trampas, pero se puede comprobar a cabo una implementación de la Unidad de patrón de trabajo utilizando Rhino.Commons a través de www.autumnofagile.net ... que está construyendo una aplicación MVC con NHibernate, Windsor y Rhino Steve Bohlen .Commons ... es una gran serie – Webjedi

Respuesta

37

No debe envolver su ISession en una instrucción using: el objetivo de pasar el ISessionBuilder al constructor del repositorio (inyección de dependencia) es que el código de llamada es responsable de controlar el ciclo de vida de la ISession. Envolviéndolo en un uso, se llama a Dispose() en la ISession y no podrá cargar elementos perezosos o persistir.

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

+0

Buena respuesta, Id arriba-vota dos veces si pudiera :) – UpTheCreek

10

Con ASP.Net MVC desea asegurarse de que la vida 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, todos sus datos se deben recopilar. No estoy seguro de si este mecanismo ayudará con eso.

Es posible que desee ver en S # arp Architechure que es un conjunto de bibliotecas y una guía para construir la aplicación ASP.Net MVC utilizando nHibernate. http://code.google.com/p/sharp-architecture/

+0

We're cu Actualmente, administra la vida de esta sesión utilizando una solicitud de inicio y una llamada de solicitud final en global.asax (ignorando css y js, etc.) No quería tener que decorar cada acción con una instrucción de unidad de trabajo. – Perhentian

+1

Al principio estaba usando la Solicitud de finalización pero luego, cuando se produjo un error crítico, la solicitud ya ha finalizado, la página se ha procesado y no vi una forma clara de manejar el error, y luego enviar al usuario a una página genérica. Prefiero un cierre explícito de la sesión (o, como mínimo, el compromiso de la transacción) a medida que se mueve del Controlador a la Vista. – JoshBerke

1

No abriría y cerraría sesiones en cada solicitud de datos a NHibernate. Usaría las bibliotecas de la Unidad de trabajo que muchos otros sugieren o leen más. NHForge.org está comenzando y creo que hay algunas prácticas sobre la configuración de NHibernate para una aplicación web general.

Uno de los "Oh, guau, esos son buenos momentos" que he recibido de NHibernate fue aprovechar la carga de las colecciones durante el desarrollo. Fue una experiencia genial poder no tener que hacer todas esas uniones para mostrar datos en algún objeto asociado.

Al cerrar la sesión de esta manera, el escenario anterior no sería posible.

Puede haber algo que esté pasando con las transacciones también.

3

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

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

+0

¿Cuál es exactamente la razón por la que abre sesión para solicitudes de archivos estáticos? –

+0

La mayoría de las soluciones utilizan un controlador de solicitudes, que como IIS 7 maneja todo en la canalización integrada, maneja las solicitudes a los recursos estáticos y no solo a las solicitudes de página. Por lo tanto, el controlador activa una transacción/sesión de Nhibernate para cada solicitud, incluidas las solicitudes de recursos estáticos. – Ted

Cuestiones relacionadas