Lo primero es recordarte que lo que has llamado BaseNegocio<T> parece un Dao<T>.. Responde a este patrón. Lo segundo es decirte que nhibernate tiene manejo contextuales de la sessión, por lo tanto lo que sabemos hacer es inyectar en el constructor del Dao, ISessionFactory. Recordar que la configuración, y el build de la session factory debería hacerse una sola vez al inicio.
Al inyectar ISessionFactory se le puede pedir a este objeto GetCurrentSession(), y sobre esa sesión hacer las operaciónes que vos decís. De esta manera el dao queda agnostico a donde lo uses, y al manejo contextual que utilices. Para un proyecto web lo que todo el mundo usa es session-per-request, sobre lo cual te recomiendo mi artículo: http://jfromaniello.blogspot.com/2009/11/como-usar-session-per-request-con.html <http://jfromaniello.blogspot.com/2009/11/como-usar-session-per-request-con.html>(son solo 100 páginas) Para un proyecto winforms, donde no hay capas distribuidas físicamente, lo que yo utilizó es la forma AOP de Conversation-per-business transaction: http://fabiomaulo.blogspot.com/2009/01/aspect-conversation-per.html En unhaddins hay ejemplos de CpBT para winforms, wpf, asp.net mvc, asp.net, monorail etc. El 7 de diciembre de 2009 11:18, Argons <[email protected]> escribió: > > Q tal, tengo una gran duda acerca del manejo de sesiones, soy nuevo > todavía en el uso de nhibernate, por lo tanto no estoy seguro bien > como realizar un manejo efectivo de las sesiones, la idea es esta: > estoy desarrollando una DAL sobre nhibernate, esta capa está pensada > en utilizarse tanto en proyectos win como web, otra de las > características de los proyectos a desarrollarse es que utilizarán el > patrón MVP, por lo tanto como será reutilizable tengo un manejador de > entidades genérico, de esta forma: > > public abstract class BaseNegocio<T> > { > #region " Constructor " > > public BaseNegocio() > { } > > #endregion > > #region " Métodos Publicos " > > public void Insertar(T entidad) > { > OperacionBaseDatos(entidad, OperacionesBD.Insertar); > } > > public void Actualizar(T entidad) > { > OperacionBaseDatos(entidad, OperacionesBD.Actualizar); > } > > public void Eliminar(T entidad) > { > OperacionBaseDatos(entidad, OperacionesBD.Eliminar); > } > > public T Obtener(int id) > { > using (ISession session = SessionManager.AbrirSesion()) > { > return session.Load<T>(id); > } > } > > #endregion > > #region " Métodos Privados " > > private void OperacionBaseDatos(object entidad, OperacionesBD > operacionesBD) > { > using (ISession session = SessionManager.AbrirSesion()) > { > using (ITransaction transaccion = > session.BeginTransaction()) > { > switch (operacionesBD) > { > case OperacionesBD.Insertar: > session.Save(entidad); > break; > case OperacionesBD.Actualizar: > session.Update(entidad); > break; > case OperacionesBD.Eliminar: > session.Delete(entidad); > break; > } > transaccion.Commit(); > } > } > } > > #endregion > } > > En el método OperacionBaseDatos la primera línea lo único q hace es > crear una fábrica de sesiones, si es q no existe una ya creada, y > llama al método OpenSession de la fábrica. Como pueden ver estoy > utilizando microoperaciones lo cual me provocan algunos errores como > cuando trato de utilizar lazy loading. > La pregunta concreta es ¿Cómo puedo hacer para un correcto manejo de > sesiones para trabajar tanto en ambiente web como win? > > Muchas gracias de antemano por los consejos y sugerencias. > Saludos. > > Ariel Gonzales > > > > --~--~---------~--~----~------------~-------~--~----~ Para escribir al Grupo, hágalo a esta dirección: [email protected] Para más, visite: http://groups.google.com/group/NHibernate-Hispano -~----------~----~----~----~------~----~------~--~---
