在ASP.NET应用程序外部使用HttpRuntime.Cache是否可以?
斯科特·汉塞尔曼(Scott Hanselman)同意。
Adding System.Web to your non-web project is a good way to get folks to panic. Another is adding a reference to Microsoft.VisualBasic in a C# application. Both are reasonable and darned useful things to do, though.
MSDN说不。
The Cache class is not intended for use outside of ASP.NET applications. It was designed and tested for use in ASP.NET to provide caching for Web applications. In other types of applications, such as console applications or Windows Forms applications, ASP.NET caching might not work correctly.
那我该怎么想呢?
解决方案
为什么不完全避免问题并使用企业库的缓存块?我们可以使用System.Web.Caching,但是如果遇到问题,我们可能会得不到Microsoft的支持,这会引起注意,所以这样做可能不值得。
要记住的一件事是,Microsoft已发布了.NET Framework客户端配置文件安装程序包。这是针对客户端应用程序的3.5框架的版本,并且具有较小的占用空间。客户端配置文件不包括框架的ASP.NET部分。
如果应用程序依赖于System.Web,它将使应用程序无法利用客户端配置文件。
有关更多详细信息,请参见Scott Gu的博客。
即使使用了它,也不要使用它,否则它可能会在下一个Service Pack /版本中停止工作。
当我们基于内部实现细节而不是合同(在本例中为MSDN)进行操作时,我们将来可能会遇到麻烦。
使用HttpRuntime.Cache应该不会有任何问题。这是一个复杂的内存哈希表,在Web上下文之外非常有用。尽管如此,在与非Http相关的应用程序中引用HttpRuntime.Cache可能会有点代码气味,因此将其包装在某些ICache接口后面并尽可能使用它可能是一个好主意。
当前的System.Web.Caching.Cache版本似乎没有任何内容依赖于HTTP运行时,除了接受接受CacheItemUpdateCallback的Insert()方法之外,因此Scott在大多数情况下都是正确的。
这不会阻止Microsoft将来修改类以使其与HTTP基础结构更加集成。
我在另一个答案中写了一个基于WeakReference的轻量级缓存。
我曾经使用过它,但是感觉不对,IIRC显着增加了内存占用量。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。相反,我实现了自己的轻量级缓存机制,该机制异常简单。
它利用了WeakReference类,该类允许缓存保留对对象的引用,但是如果引用未使用,则允许垃圾回收器回收内存。
我唯一没有的是一个单独的线程来清理缓存中的陈旧项。我要做的是,如果缓存中有> x个项目,那么我将遍历所有缓存的项目并在添加新项目之前清除掉旧项目。
如果我们需要更强大的功能,请使用MS Enterprise Library缓存应用程序块之类的东西。
我意识到这个问题很旧,但是为了帮助任何通过搜索找到它的人,值得注意的是.net v4包括了针对这种情况的新的通用缓存。它在System.Runtime.Caching命名空间中:
https://msdn.microsoft.com/zh-CN/library/dd997357(v=vs.110).aspx
对默认缓存实例的静态引用是:MemoryCache.Default
如果我们正在寻找一个通用的解决方案:这是依赖项注入方法的一种典型情况。使用这种方法,我们可以关注Scott Hanselman和MSDN!
在库中没有System.Web引用的情况下,插入诸如HttpRuntime.Cache之类的System.Web依赖项。