2011-03-09 16 views
9

Estoy usando ASP.NET MVC 3 con Ninject y NHibernate.Will Ninject llamar a disponer y cerrar NHibernate Isession?

Al pensar en DI, creo que el que obtener el recurso también se asegura para cerrarla (En este caso debe ser responsable de Ninject)

pero no estoy seguro de cómo funciona Ninject cuando se utiliza InRequestScope.

Mi código es:

Bind<ISession>().ToMethod(context => context.Kernel.Get<ISessionFactory>().OpenSession()).InRequestScope(); 

puedo abrir una sesión y la puso en lo InRequestScope, pero se toman Ninject de cerrar mi ISession cuando está fuera del alcance de la solicitud?

+0

¿Puede explicar cómo esto difiere de http://stackoverflow.com/questions/5221620/nhibernate-dependency-injection-close-isession-properly por favor y/o considere cerrar este - hay muchos dups de esta pregunta que ¿Por qué ninguno de ellos tiene una respuesta adecuada IMO? –

+0

La pregunta a la que se refiere tiene dos respuestas que son contradictorias y de hecho recibí buenas respuestas aquí, ¿pero ahora está eliminada? ¿Tal vez por ti? – Luticka

+0

@Lutica: El problema es que hay prob al menos 2 medias preguntas + respuestas más. @Darin borró el suyo como uno de los mantenedores (@Remo Gloor) señaló una deficiencia en su respuesta. @Darin probablemente debería haberlo dejado y editado en una retractación, ya que el hecho de que malinterpretó algo es una experiencia de aprendizaje para cualquiera de ustedes. Si pudiera eliminar publicaciones, ciertamente no - comentaría en la respuesta para arreglarlo o publicaría una versión mejorada si eso no me da ningún resultado –

Respuesta

7

Si entiendo el código correctamente, la respuesta es sí. Una de las Estrategias de Activación usadas por Ninject es la Estrategia Desechable, cuyo método de Desactivar llama a Dispose sobre cualquier cosa que implemente IDisposable. Si está utilizando las extensiones Ninject.Web.MVC, OnePerRequestModule borrará automáticamente la caché de enlace. Esto llamará al método Deactivate en todas las estrategias de activación, incluida la estrategia desechable.

Dado que ISession implementa IDisposable, será desechado. La implementación predeterminada de ISession, SessionImpl, cierra la sesión en Dispose.

Si no está utilizando las extensiones Ninject.Web.MVC, la caché finalmente se borrará, pero puede que no ocurra justo en EndRequest.

Cuestiones relacionadas