4

我刚刚被 Ninject.Mvc3 NuGet 包弄湿了,我想知道创建的对象能持续多久。

InRequestScope很容易理解:只要网络服务器正在处理特定的网络请求,在这个范围内创建的每个对象都会存在。(为了迂腐,对象和对象一样长HttpContext.Current

但是这些InSingletonScope物体能持续多久?文档说,只要 Ninject Kernel 本身执行 - 它就包含在NinjectWebCommon静态类中。到目前为止,我做出的最好的猜测是,只要服务器运行 webapp,内核就会存在——只要服务器启动,直到应用程序在 IIS 中手动重新启动或更新,对象就在范围内。

我很好奇,因为我很想拥有一些包含只读数据字典的数据访问器作为 Singleton Scope,我想知道这是一个好主意,还是计划中的内存泄漏。

4

2 回答 2

5

只要您的 ASP.NET 应用程序池持续存在,它就会持续存在。

您的应用程序池何时会回收?有许多设置可以控制这一点:阅读为应用程序池配置回收设置 (IIS 7)

不过,基本上,它不会永远存在:如果您想在其中存储只读数据,只需确保将其全部加载,Application_Start()以便在请求进入时准备好,您应该一切顺利。

于 2012-12-18T09:58:29.730 回答
2

你是对的。只要应用程序池正在运行,您的单例就会存在。为什么您可能想要关闭应用程序池回收。

对于我的大多数网站,我将设置缓存在静态类中(或使用 Ninject 或 StructureMap 作为单例),并将数据缓存在线程安全字典中。这当然会消耗内存,但它不是内存泄漏。按设计工作。

于 2012-12-18T10:02:29.710 回答