我刚刚用Ninject.Mvc3 NuGet软件包弄湿了,我想知道创建的对象有多长时间了。
每个人都明白 InRequestScope
:只要网络服务器处理特定的网络请求,在此范围内创建的每个对象都会存在。 (为了迂腐,只要HttpContext.Current
对象存在,对象就会存在)
但是InSingletonScope
对象持续多长时间?文档说只要Ninject Kernel本身也可以 - 它包含在NinjectWebCommon
静态类中。到目前为止,我做的最好的猜测是,只要服务器运行webapp,内核就会存在 - 只要服务器启动,直到在IIS中手动重新启动应用程序或更新,对象就在范围内。
我很好奇,因为我很想让一些包含只读数据字典的数据访问器作为Singleton Scope,我想知道这是一个好主意,还是计划中的内存泄漏。
答案 0 :(得分:4)
只要您的ASP.NET应用程序池持续,它就会持续。
您的应用程序池何时回收?有许多设置可以控制这一点:阅读Configuring Recycling Settings for an Application Pool (IIS 7)。
但基本上,它不会永远存在:如果你想在那里存储只读数据,只需确保在Application_Start()
中加载所有数据,以便在请求进入时准备就绪,并且你应该好好去。
答案 1 :(得分:2)
你是对的。只要应用程序池正在运行,您的单身人士就会活着。为什么您可能想要关闭应用程序池回收。
对于我的大多数网站,我将设置缓存在静态类中(或使用Ninject或StructureMap作为单例),以及线程安全词典中的数据。这当然会消耗内存,但它不是内存泄漏。按设计工作。