39

Scott Hanselman说是的。

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

MSDN说不

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

那我应该怎么想?

4

8 回答 8

27

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

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

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

于 2010-05-05T08:08:48.220 回答
5

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

于 2008-10-01T17:23:05.360 回答
4

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

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

有关详细信息,请参阅Scott Gu 的博客。

于 2008-10-01T17:22:29.387 回答
2

在当前版本的 System.Web.Caching.Cache 中似乎没有任何依赖于 HTTP 运行时的东西,除了Insert()接受 a 的方法 CacheItemUpdateCallback,所以 Scott 在大多数情况下是正确的。

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

我在另一个答案中写了一个基于 WeakReference 的轻量级缓存。

于 2008-10-01T17:27:57.720 回答
1

不要使用它,即使它确实有效,它也会在下一个服务包/版本中停止工作。

当您基于内部实现细节而不是合同(在本例中为 MSDN)做某事时,您可能会在未来遇到麻烦。

于 2008-10-01T17:22:58.323 回答
1

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

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

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

如果您需要更健壮的东西,请使用 MS Enterprise Library Caching Application Block之类的东西。

于 2008-10-01T20:35:55.257 回答
1

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

注入像 HttpRuntime.Cache 这样的 System.Web 依赖项,而您的库中没有 System.Web 引用。

于 2010-05-05T13:50:39.990 回答
0

为什么不完全避免这个问题并使用企业库的缓存块?您可以使用 System.Web.Caching,但如果遇到问题,您可能无法获得 Microsoft 支持,而且您会引起注意,因此可能不值得。

于 2008-10-01T17:21:18.157 回答