2008-10-01 63 views
37

Scott Hanselman says yes可以在ASP.NET應用程序外部使用HttpRuntime.Cache嗎?

將System.Web添加到您的非web項目是讓人們恐慌的好方法。另一種方法是在C#應用程序中添加對Microsoft.VisualBasic的引用。不過,這兩件事都是合理的,並且是有益的事情。

MSDN says no

Cache類不適合在ASP.NET應用程序之外使用。它的設計和測試可用於ASP.NET,爲Web應用程序提供緩存。在其他類型的應用程序中,如控制檯應用程序或Windows窗體應用程序,ASP.NET緩存可能無法正常工作。

那我該怎麼想?

+2

+1對於這個問題:我當然希望看到一個權威性的迴應 - 即MSDN爲什麼拒絕,以及在ASP.NET環境以外使用它的具體問題是什麼。我已經將它用在沒有任何問題的客戶端使用的類庫中。 – Joe 2008-10-01 20:50:41

+2

Microsoft說:是的[在非Web應用程序中使用ASP.NET緩存](http://msdn.microsoft.com/en-us/library/Ee817647%28pandp.10%29.aspx) – lsalamon 2010-07-26 20:19:05

回答

27

我意識到這個問題已經過時,但爲了幫助任何通過搜索找到這個問題的人,其值得注意的是,.net v4包含一個新的通用緩存用於這種類型的場景。它在System.Runtime.Caching命名空間:

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

靜態參考默認緩存實例是:MemoryCache.Default

0

爲什麼不完全避免這個問題,並使用Caching Block of Enterprise Library?您可以使用System.Web.Caching,但如果遇到問題,您可能不會得到Microsoft支持,並且您會引起注意,因此可能不值得。

+0

Imho Enterprise Library是好吧,但有些用途有點沉重。 – 2008-10-01 17:25:04

4

要記住的一件事是Microsoft已經發布了.NET Framework客戶端配置文件安裝程序包。這是針對客戶端應用的3.5框架版本,佔用空間更小。客戶端配置文件不包括該框架的ASP.NET部分。

如果您的應用程序依賴於System.Web,它將停止您的應用程序能夠利用客戶端配置文件。

查看Scott Gu's Blog瞭解更多詳情。

1

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

當您根據內部實施細節而不是合同(在這種情況下,MSDN)做某些事情時,您可能會在未來遇到麻煩。

5

使用HttpRuntime.Cache應該沒有任何問題。這是一個複雜的內存散列表,可以在web上下文以外非常有用。儘管如此,在非Http相關的應用程序中引用HttpRuntime.Cache可能有點代碼味,因此將它包裝在某個ICache接口的後面並儘可能使用它是個不錯的主意。

2

似乎沒有要在依賴除外接受CacheItemUpdateCallbackInsert()方法的HTTP運行時的System.Web.Caching.Cache的當前版本的東西,所以斯科特是正確的大部分。

這並不妨礙Microsoft在將來修改該類以便與HTTP基礎結構更加集成。

我在另一個答案中寫了一個WeakReference-based lightweight cache

1

我曾經使用它,但它感覺不對,IIRC相當戲劇性地增加了內存佔用量。相反,我實現了我自己的輕量級緩存機制,這非常容易。

它利用了WeakReference類,該類允許緩存保持對對象的引用,但是如果引用未被使用,垃圾收集器也可以回收內存。

我唯一沒有的是一個單獨的線程來清理緩存中的陳舊項目。我所做的是,如果緩存中有> x項目,我會在添加新項目之前瀏覽所有緩存項目並掃出舊項目。

如果您需要更強大的功能,請使用MS企業庫Caching Application Block之類的東西。

1

如果你正在尋找一個通用的解決方案:這是一個典型的情況爲依賴注入方法。使用這種方法,您可以按照Scott Hanselman MSDN!

注入像HttpRuntime.Cache一樣的System.Web依賴項,而不在庫中包含System.Web引用。

相關問題