2009-11-10 10 views
9

Esta es una pregunta bastante fundamental al usar NHibernate en una aplicación web, pero no veo ninguna mejor práctica acordada cuando busco en la web. Lo he visto hecho en muchos lugares diferentes:¿Dónde abrir y cerrar NHibernate ISession en una aplicación web (específicamente MVC)?

Creado y dispuesto en el método de Repository - Esto me parece una tontería, ya que cuando obtiene el objeto ya está desprendido.

Al comienzo y al final de la acción del controlador - Esto parece mejor, pero molesto tener que hacerlo para cada acción.

a nivel de aplicación, en BeginRequest global.asax y EndRequest - Esta parece la mejor idea, pero de nuevo, he visto algunos ejemplos en la creación de Init en lugar de BeginRequest (arquitectura afilada por ejemplo) - aunque estoy no estoy seguro de por qué.

¿Quizás hay otros enfoques?
¿Pueden los contenedores IoC ayudar de alguna manera aquí?
¿Quizás conoces un buen recurso en la web con respecto a esto?
Y, ¿qué método usas?

Gracias

+0

Sharp Architecture explica por qué, es algo con IIS7 por lo que recuerdo. – queen3

+0

Bueno, en los comentarios del código dice: "Debido a problemas en IIS7, la inicialización de NHibernate debe ocurrir en Init().", Pero no sé cuáles son los problemas. – UpTheCreek

Respuesta

0

He visto algunos ejemplos creando en Init en lugar de beginrequest (arquitectura nítida, por ejemplo), aunque no estoy seguro de por qué.

En IIS 7 Puede tener acceso al estado de sesión en el evento Init de Global.asax. Es por eso que sharp arch usa beginrequest.

En cuanto a la gestión de sesiones, estoy de acuerdo con usted: Global.asax es el mejor lugar para ello. Evento si desea tener una separación limpia entre capas y eliminar la configuración DAL de la interfaz de usuario, puede usar HttpModule para ello.

También puedes echar un vistazo a ayende's blog. Explica su forma de gestión de sesiones

+0

Hola Sly, pero ¿por qué necesitas usar el estado de sesión de ASP.NET? ¿Y por qué no simplemente ponerlo en Application_Start? – UpTheCreek

+0

Necesita estado de sesión para almacenar ISession del NHibernate. No puede hacerlo en Application_Start porque no puede tener acceso a ApplicationState, y lo necesita para poner SessionFactory en él – Sly

+0

La mayoría de las soluciones que he estado viendo no usan el estado de sesión, más bien HttpContext.Items o un miembro estático. – UpTheCreek

Cuestiones relacionadas