可以在ASP.NET应用程序外部使用HttpRuntime.Cache吗?
Scott Hanselman 说是的 。
将System.Web添加到您的非Web项目是让人们恐慌的好方法。 另一种方法是在C#应用程序中添加对Microsoft.VisualBasic的引用。 不过,两者都是合理的,也是有益的事情。
MSDN 说不 。
caching类不打算在ASP.NET应用程序之外使用。 它的devise和testing是为了在ASP.NET中使用,为Web应用程序提供caching。 在其他types的应用程序中,如控制台应用程序或Windows窗体应用程序,ASP.NETcaching可能无法正常工作。
那我该怎么想?
我意识到这个问题是旧的,但为了帮助任何人通过searchfind这个问题,值得注意的是.net v4包含一个新的通用caching这种types的情况。 它在System.Runtime.Caching命名空间中:
https://msdn.microsoft.com/en-us/library/dd997357(v=vs.110).aspx
对默认caching实例的静态引用是:MemoryCache.Default
使用HttpRuntime.Cache不应该有任何问题。 这是一个复杂的内存哈希表,可以在web上下文以外非常有用。 不过,在非Http相关的应用程序中引用HttpRuntime.Cache可能有点代码味,所以将它包装在某个ICache接口的后面并尽可能使用它是一个好主意。
有一件事要记住,微软已经发布了.NET框架客户端configuration文件安装包。 这是针对客户端应用程序的3.5框架版本,并且占用空间更小。 客户端configuration文件不包括框架的ASP.NET部分。
如果您的应用程序依赖于System.Web,则会阻止您的应用程序使用客户端configuration文件。
请参阅Scott Gu的博客了解更多详情。
除了接受CacheItemUpdateCallback
的Insert()
方法之外,似乎没有任何依赖于HTTP运行时的System.Web.Caching.Cache的当前版本,所以Scott在大多数情况下是正确的。
这并不妨碍Microsoft在将来修改该类以便与HTTP基础结构更加集成。
我在另一个答案中写了一个基于WeakReference的轻量级caching 。
不要使用它,即使它可以工作,也可以在下一个服务包/版本中停止工作。
当你根据内部实现细节而不是合同(在这种情况下,MSDN)做一些事情的时候,你可能会在将来遇到麻烦。
我曾经使用它,但它感觉不对,IIRC相当戏剧性地增加了内存占用。 相反,我实现了我自己的轻量级caching机制,这非常容易。
它使用了WeakReference类,它允许caching保持对对象的引用,但是如果引用未被使用,垃圾收集器也可以回收内存。
我唯一没有的是一个单独的线程来清理caching中的陈旧项目。 我所做的是如果caching中有> x项目,我会通过所有的caching项目,并在添加新项目之前将旧项目找出来。
如果您需要更强大的function,请使用MS企业库caching应用程序块 。
如果您正在寻找一个通用的解决scheme:这是dependency injection方法的典型情况。 使用这种方法,你可以关注Scott Hanselman 和 MSDN!
注入像HttpRuntime.Cache的System.Web依赖项,而不在库中有System.Web引用。
为什么不完全避免这个问题,并使用企业库的caching块 ? 你可以使用System.Web.Caching,但是如果遇到问题,你可能不会得到微软的支持,所以你可能会觉得不值得。