【问题标题】:Will Ninject call dispose and close the NHibernate Isession?Ninject 会调用 dispose 并关闭 NHibernate Isession 吗?
【发布时间】:2011-03-09 08:45:09
【问题描述】:

我正在使用带有 Ninject 和 NHibernate 的 ASP.NET MVC 3。

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

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

我的代码是:

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

我打开一个会话并将其放入 I InRequestScope,但是当 ISession 超出请求范围时,Ninject 是否会关闭我的 ISession?

【问题讨论】:

  • 您能否解释一下这与 stackoverflow.com/questions/5221620/… 有何不同和/或考虑关闭它 - 这个问题有很多重复,这就是为什么他们都没有一个正确的答案 IMO?
  • 你提到的问题有两个矛盾的答案,其实我在这里得到了很好的答案,但现在它被删除了?也许是你?
  • @Lutica:问题是至少还有 2 个半问题+答案。 @Darin 删除了他,因为维护者之一(@Remo Gloor)指出他的回答有缺陷。 @Darin 可能应该留下它并在撤稿中进行编辑,因为他误解了某些东西这一事实对你们中的任何人来说都是一种学习经历。如果我能够删除帖子,我当然不会 - 如果没有得到任何结果,我会评论答案以修复它或发布改进版本
  • @Lutica:我在这里坚持的原因是没有像样的答案、问题或博客文章关于在 MVC3 中正确使用 Ninject 和 NHibernate,人们只能被提及,以及每个新问题半生不熟的答案只会让问题变得更糟,而不是更好。如果有人能找出最好的问题,我会悬赏它......
  • BTW S#arpArchitecture 通常被建议作为在该领域寻找最佳实践的地方,但您通过查看其他答案就知道了!

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


【解决方案1】:

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

由于 ISession 实现了 IDisposable,它会被释放。 ISession 的默认实现 SessionImpl 在 Dispose 时关闭 Session。

如果您不使用 Ninject.Web.MVC 扩展,缓存最终会被清除,但可能不会在 EndRequest 时发生。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    相关资源
    最近更新 更多