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

在ASP.NET应用程序之外使用HttpRuntime.Cache可以吗?,.net,caching,.net,Caching,斯科特·汉塞尔曼 将System.Web添加到非Web项目中是一种让人们恐慌的好方法。另一个是在C#应用程序中添加对Microsoft.VisualBasic的引用。不过,这两件事都很合理,而且非常有用 MSDN 缓存类不打算在ASP.NET应用程序之外使用。它是为在ASP.NET中为Web应用程序提供缓存而设计和测试的。在其他类型的应用程序(如控制台应用程序或Windows窗体应用程序)中,ASP.NET缓存可能无法正常工作 那么,我该怎么想呢?为什么不完全回避这个问题,并使用?您可以使用Sy

斯科特·汉塞尔曼

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

MSDN

缓存类不打算在ASP.NET应用程序之外使用。它是为在ASP.NET中为Web应用程序提供缓存而设计和测试的。在其他类型的应用程序(如控制台应用程序或Windows窗体应用程序)中,ASP.NET缓存可能无法正常工作


那么,我该怎么想呢?

为什么不完全回避这个问题,并使用?您可以使用System.Web.Caching,但如果遇到问题,您可能无法获得Microsoft的支持,并且您会大惊小怪,因此可能不值得这么做。

请记住,Microsoft已发布了.NET Framework客户端配置文件安装包。这是针对客户端应用程序的3.5框架的一个版本,占用空间较小。客户端配置文件不包括框架的ASP.NET部分

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


有关更多详细信息,请参阅。

不要使用它,即使它可以工作,也可能在下一个service pack/版本中停止工作


当您根据内部实现细节而不是合同(在本例中为MSDN)执行某些操作时,您可能会在将来遇到麻烦。

使用HttpRuntime.Cache应该不会有任何问题。它是一个复杂的内存哈希表,在web环境之外非常有用。不过,在与Http无关的应用程序中引用HttpRuntime.Cache可能有点代码味道,因此,最好将其封装在某个ICache接口后面,并尽可能使用该接口。

当前版本的System.Web.Caching.Cache中似乎没有任何依赖于HTTP运行时的内容,除了接受
CacheItemUpdateCallback
Insert()
方法之外,所以斯科特在很大程度上是对的

这并不妨碍Microsoft将来修改该类,使其与HTTP基础结构更加集成


我在另一个答案中写了一个。

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

它使用的类允许缓存保留对对象的引用,但也允许垃圾收集器在引用未使用时回收内存

我唯一没有的是一个单独的线程来清理缓存中的过时项目。我所做的是,如果缓存中有>x个项目,我会检查所有缓存的项目,并在添加新项目之前剔除旧项目


如果您需要更强大的功能,请使用类似MS Enterprise Library的功能。

我知道这个问题很老了,但是为了帮助通过搜索找到它的人,值得注意的是.net v4为这种类型的场景提供了一个新的通用缓存。它位于System.Runtime.Caching命名空间中:


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

如果您正在寻找通用解决方案:这是依赖项注入方法的典型情况。使用此方法,您可以了解Scott HanselmanMSDN


在你的库中没有System.Web引用的情况下,注入一个System.Web依赖项,如HttpRuntime.Cache。

Imho企业库是可以的,但对于某些用途来说有点重。你肯定不会得到对企业库的支持!EntLib的使用和设置更加困难。+1的问题:我当然希望看到权威性的回答,即为什么MSDN说不,以及在ASP.NET环境之外使用它的具体问题是什么。我在客户端使用的类库中使用过它,没有任何问题。Microsoft说是的:System.Runtime.Caching不在客户端配置文件中,为了使用它,您需要完整的框架,因此对于客户端应用程序来说是没有用的。@Juan-是的,很遗憾,它没有包含在客户端配置文件中。根据bug报告,微软计划最终将其迁移到那里。您可以通过投票来表示您对修复的支持: