asp.net-mvc - studio - nhibernate tutorial
Gestión de sesiones NHibernate en ASP.NET MVC (5)
Actualmente estoy jugando con la clase HybridSessionBuilder que se encuentra en la publicación de 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 administrar 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 alguna dificultad para hacer acceso a la base de datos de esta manera?
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 obtuve 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é sucediendo con las transacciones también.
No debe envolver su ISession en una instrucción de uso; 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?
Con ASP.Net MVC, usted quiere 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 examinar S # arp Architechure, que es un conjunto de bibliotecas y una guía para crear la aplicación ASP.Net MVC utilizando nHibernate. http://code.google.com/p/sharp-architecture/
Esta es la configuración que utilicé después de investigar esto más. Parece funcionar bien y no tiene el hábito molesto de crear una ISession en solicitudes de archivos estáticos como la mayoría de las guías que hay:
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