我正在使用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吗?
答案 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上发生。