Architecting Nhibernate - Sesiones

14 views
Skip to first unread message

Argons

unread,
Dec 7, 2009, 9:18:22 AM12/7/09
to NHibernate-Hispano
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

José F. Romaniello

unread,
Dec 7, 2009, 12:49:08 PM12/7/09
to nhibernat...@googlegroups.com
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:
(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:

En unhaddins hay ejemplos de CpBT para winforms, wpf, asp.net mvc, asp.net, monorail etc.

Argons

unread,
Dec 10, 2009, 12:03:53 PM12/10/09
to NHibernate-Hispano
Muchas gracias por tus comentarios y apreciaciones José, estoy
revisando tus artículos y los ejemplos de uNhAddins para comprender
mejor CpBT


On 7 dic, 13:49, José F. Romaniello <jfromanie...@gmail.com> wrote:
> 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-reques...
> <http://jfromaniello.blogspot.com/2009/11/como-usar-session-per-reques...>(son
> > Ariel Gonzales- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -
Reply all
Reply to author
Forward
0 new messages