2012-10-05 88 views
4

也許這個問題應該很容易,但事實並非如此。我已閱讀Problem Using the System.Web.Caching.Cache Class in ASP.NETSystem.Web.Caching.Cache在模型中拋出空異常

我有一個單例類:

private System.Web.Caching.Cache _cache; 
private static CacheModel _instance = null; 

private CacheModel() { 
    _cache = new Cache(); 
} 

public static CacheModel Instance { 
     get { 
      return _instance ?? new CacheModel(); 
     } 
     } 

public void SetCache(string key, object value){ 
    _cache.Insert(key, value); 
} 

如果其他地方在我的代碼,我調用下面:

CacheModel aCache = CacheModel.Instance; 
aCache.SetCache("mykey", new string[2]{"Val1", "Val2"}); //this line throws null exception 

爲什麼第二行拋出一個空引用異常?

也許我在代碼的某處犯了一些錯誤?

謝謝。

回答

9

你不應該使用Cache類型to initialise your own instance

此API支持.NET Framework基礎結構,不適合直接在代碼中使用。

不要直視爲什麼你會得到一個空引用異常,我也遇到了這個問題之前,這是tied in with the infrastructure and lifecycle of a web application:每個應用程序創建該類的

一個實例域,只要應用程序域保持活動狀態,它仍然有效。有關此類的實例的信息可通過HttpContext對象的Cache屬性或Page對象的Cache屬性獲取。

底線,不以這種方式直接使用System.Web.Caching.Cache類型 - 無論是訪問一個存在的緩存實例或使用像Caching Application Block of the Enterprise Library的替代品。

+0

這是一種獲得Cache並操縱它們的可能性嗎? –

1

正如Grant在上面指出的那樣,System.web.caching.cache存儲了ASP.NET內部數據(例如已經構建在App_start中的包)。

改爲使用System.Runtime.Cachinghere's the walkthrough on MSDN

這裏有一個片段: `

using System.Runtime.Caching; 

... 

ObjectCache cache = MemoryCache.Default; 
var test = "hello world"; 
cache["greeting"] = test; 
var greeting = (string)cache["greeting"]; 

`

在ASP.NET 4時,高速緩存使用ObjectCache類實現。 read more on MSDN