Pregunta

Nuevo en NHibernate (mi descargo de responsabilidad). Encontré un artículo similar e interesante sobre MVC , sin embargo, Tengo más curiosidad sobre cuáles son las mejores prácticas generales para administrar las sesiones de NHibernate dentro de una aplicación web genérica.

Me he encontrado con el Burrow , pero estoy empezando a darse cuenta de que parece que hay algunas direcciones diferentes para tomar. Sé que probablemente no sea lo mejor para mí crear una nueva SessionFactory cada vez que lo necesite tocar la base de datos, así que estoy interesado en lo que hace la comunidad para administrar las sesiones. ¿Usas Burrow? ¿Envuelve su SessionFactory en un singleton?

Cualquier dirección o visión siempre es muy apreciada.

¿Fue útil?

Solución

Para responder su pregunta directamente, su objeto ISessionFactory debe ser un singleton. Puede hacerlo mediante programación (es decir, envolviéndolo en un singleton de C #) o configurándolo en su contenedor IoC.

En cuanto a las sesiones, Burrow se ve bien, pero el patrón predominante y más simple para las sesiones en aplicaciones web, OpenSessionInView, viene de fábrica con NHibernate 2.0.0. Es decir, su código de acceso a datos llama a ISessionFactory.GetCurrentSession () en lugar de ISessionFactory.OpenSession () . Luego, indique cómo se gestiona la sesión actual de fábrica especificando una implementación de ICurrentSessionContext . NHibernate proporciona dos listas para usar para alinear la sesión con la solicitud web. Esto se conoce como 'Sesiones contextuales' en la documentación.

Sin duda, una aplicación web más compleja puede requerir conversaciones más duraderas con carga lenta compleja, etc., pero para una aplicación web estándar las sesiones contextuales de NHibernate deberían ser suficientes.

Otros consejos

Escribí una serie de publicaciones de blog sobre este tema con respecto a los patrones NHibernate / Fluido NHibernate Data Access.

Lo primero que recomiendo es abstraer la interacción de NHibernate.

Crear un Repositorio NHiberate genérico y extensible común

Luego, para manejar la administración de la sesión, implementé la "Sesión por conversación comercial" patrón que, en lugar de tener una sesión NH, existe durante la vida de una solicitud de página única que es común, existe para una serie de eventos, por ejemplo, una página que le permite realizar un montón de ediciones a un formulario y luego al final aplíquelos todos de forma permanente o cancélelos.

Conversación por Transacción comercial con PostSharp e IoC

Si fuera a escribir esta publicación hoy, no usaría PostSharp nuevamente para manejar el código AOP (Programación Orientada al Aspecto) en mi proyecto, o usaría Linfu.AOP u otro marco para hacer la interacción AOP.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top