在ASP.NET应用程序之外使用HttpRuntime.Cache可以吗?

时间:2008-10-01 17:17:55

标签: .net caching

Scott Hanselman says yes

  

将System.Web添加到非Web项目中是让人们恐慌的好方法。另一种是在C#应用程序中添加对Microsoft.VisualBasic的引用。不过,两者都是合理且有用的事情。

MSDN says no

  

Cache类不适用于ASP.NET应用程序之外。它的设计和测试用于ASP.NET,以便为Web应用程序提供缓存。在其他类型的应用程序中,例如控制台应用程序或Windows窗体应用程序,ASP.NET缓存可能无法正常工作。

那我该怎么想?

8 个答案:

答案 0 :(得分:27)

我意识到这个问题已经过时了,但为了帮助任何通过搜索找到这个问题的人,值得注意的是.net v4包含了针对此类场景的新通用缓存。它位于System.Runtime.Caching命名空间中:

https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx

对默认缓存实例的静态引用是:MemoryCache.Default

答案 1 :(得分:5)

使用HttpRuntime.Cache应该没有任何问题。它是一个复杂的内存中哈希表,在Web上下文之外非常有用。尽管如此,在非Http相关的应用程序中引用HttpRuntime.Cache可能有点代码味道,所以将它包装在一些ICache接口后面是一个好主意,并尽可能使用它。

答案 2 :(得分:4)

要记住的一件事是Microsoft已发布.NET Framework Client Profile Setup Package。这是3.5框架的一个版本,针对客户端应用程序并且占用空间减少。客户端配置文件不包含框架的ASP.NET部分。

如果您的应用程序依赖于System.Web,它将阻止您的应用程序利用客户端配置文件。

有关详细信息,请参阅Scott Gu's Blog

答案 3 :(得分:2)

当前版本的System.Web.Caching.Cache中似乎没有任何依赖于HTTP运行时的内容,除了 Insert() 方法接受{{1斯科特在大多数时候都是对的。

这不会阻止Microsoft在将来修改类以与HTTP基础结构进行更多集成。

我在另一个答案中写了WeakReference-based lightweight cache

答案 4 :(得分:1)

不要使用它,即使它确实有效,它也可以在下一个Service Pack /版本中停止工作。

根据内部实施细节而非合同(在本例中为MSDN),您可能会在将来陷入麻烦。

答案 5 :(得分:1)

我曾经使用它,但它感觉不对,IIRC极大地增加了内存占用。相反,我实现了自己的轻量级缓存机制,这非常容易实现。

它使用WeakReference类,它允许缓存保持对对象的引用,但也允许垃圾收集器在未使用引用的情况下回收内存。

我唯一没有的是一个单独的线程来清理缓存中的陈旧项目。我所做的是如果缓存有>其中有x个项目,我会在添加新项目之前浏览所有缓存的项目并删除旧项目。

如果您需要更强大的功能,请使用MS Enterprise Library Caching Application Block等内容。

答案 6 :(得分:1)

如果您正在寻找一般解决方案:这是依赖注入方法的典型情况。使用这种方法,您可以关注Scott Hanselman MSDN!

在HttpRuntime.Cache中注入System.Web依赖项,而不在库中使用System.Web引用。

答案 7 :(得分:0)

为什么不完全避免这个问题并使用Caching Block of Enterprise Library?你可以使用System.Web.Caching,但如果你遇到问题你可能不会得到微软的支持,你会引起人们的注意,因此它可能不值得。