Ninject会调用dispose并关闭NHibernate Isession吗?

时间:2011-03-09 08:45:09

标签: nhibernate asp.net-mvc-3 dependency-injection ninject

我正在使用ASP.NET MVC 3和Ninject以及NHibernate。

在考虑DI时,我认为获得资源的人也确保关闭它(在这种情况下,Ninject应该负责)

但是我不确定使用InRequestScope时Ninject是如何工作的。

我的代码是:

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

我打开一个会话并把它放在I InRequestScope中,但是当Ninject超出请求范围时Ninject会关闭我的ISession吗?

1 个答案:

答案 0 :(得分:7)

如果我正确理解代码,答案是肯定的。 Ninject使用的ActivationStrategies之一是DisposableStrategy,它的Deactivate方法在实现IDisposable的任何东西上调用Dispose。如果您正在使用Ninject.Web.MVC扩展,OnePerRequestModule将自动清除绑定缓存。这将在所有ActivationStrategies上调用Deactivate方法,包括DisposableStrategy。

由于ISession实现了IDisposable,它将被处理掉。 ISession的默认实现,SessionImpl,关闭Session on Dispose。

如果你没有使用Ninject.Web.MVC扩展,那么Cache最终会被清除,但可能不会在EndRequest上发生。