2013-04-17 85 views
0

在我的AppStart.cshtml中,我從數據庫中獲取一些數據,進行計算,序列化/反序列化json字符串等,然後通過執行類似的操作將結果存儲在一對AppState變量中以下內容:(C#)在AppState和Session中存儲數據

AppState["myVar1"]="aString"; 
AppState["myVar2"]=anArray; 

這些變量被頻繁訪問,是一個有點重來定義,所以我認爲像這樣的意義,而不是從頭開始創建每一個需要它的時候的數據。即使不需要優化,它仍然對我有意義,因爲它通過在需要數據的一堆地方沒有相同的代碼來提高可讀性和明確的可維護性。

同樣,我通過在用戶登錄時將數據放入會話中來按用戶進行類似的操作,例如,

Session["userVar1"]="myString"; 
Session["userVar2"]=myAray; 

不過,我剛纔讀的,我們永遠不應該依賴於存儲在這些數據仍然存在,當我們想讀他們,因爲他們存儲在其中可能已經清除了服務器內存。 這是真的嗎? 所以當我們想要訪問其中的一個時,我們應該首先檢查它是否爲空?如果我們幸運的話,它不是空的,我們可以馬上使用它,否則我們再次設置它。 這是應該如何使用存儲在AppState和Session中的數據?如果是這樣,如果它們爲空,重新設置它們的好方法是什麼?我想做一些創建一個函數來設置它們,如果它們爲空?

回答

1

就你而言,如果數據偶爾會被服務器清除(例如,從IIS重新啓動應用進程),聽起來好像沒問題,因爲你描述的只是一個緩存場景。緩存數據本質上是暫時的。如果它在那裏,請使用它。如果它不存在,請重新獲取它(並再次使用結果填充緩存)。

我建議從緩存本身的結構中抽象出緩存機制(應用狀態和會話狀態)。在這個結構中,你可以檢查數據是否被緩存,如果沒有,則重新緩存它。考慮這樣一個對象:

public class CacheManager 
{ 
    public static string MyString 
    { 
     get 
     { 
      if (string.IsNullOrWhiteSpace(AppState["myVar1"])) 
      { 
       // Fetch the value to be cached and set it in AppState["myVar1"] 
      } 
      return AppState["myVar1"]; 
     } 
    } 
} 

現在隨時隨地在你的應用程序,你可以通過調用獲得的價值:

CacheManager.MyString 

應用程序的其餘部分不知道或不關心,如果從應用程序狀態的,或會話狀態,或數據庫,文件或任何其他瞬態位置緩存數據。這完全由緩存管理器對象處理。所以如果你想改變某些值的位置,你可以在那個地方改變它們。或者,如果出於測試目的,您希望完全刪除緩存並始終將數據存活,則只需將緩存管理器實現換成總是返回重新獲取數據的緩存管理器實現。應用程序的其餘部分完全沒有意識到實現。

+0

好的,這看起來非常好。謝謝你的答案。我會盡快嘗試。 – Clox

+0

對不起,在這裏新手問題,但我似乎無法弄清楚如何使用從類文件中的AppState等。仍然是新的這個..我得到:「名稱」AppState「不存在於當前的上下文中」。我想我必須使用using-keyword來導入它,但我無法弄清楚如何去做。 – Clox

+0

@Clox:取決於它存在的位置。請記住,這個類仍然與Web應用程序緊密耦合(憑藉使用應用程序和會話),所以它應該在同一個項目中。我以前從未使用過'AppState',而且自從使用'Session'以來已經很長時間了。但正如我記得'Session'是'HttpContext'的一部分。所以,至少在很久以前,它會被System.Web.HttpContext.Current調用。會話「(http://msdn.microsoft.com/en-us/library/system.web.httpcontext.aspx)在基本頁面類(或基本控制器類)上,」會話「剛剛映射到該屬性。 – David

相關問題