2011-03-27 19 views
56

我看到ASP.NET MVC使用session數據的兩種方法:爲什麼ASP.NET中有兩個不兼容的會話狀態類型?

  • System.Web.SessionState.HttpSessionState,可在HttpApplication
  • System.Web.HttpSessionStateBase,存儲在一個Controller

有數據似乎可用在另一個。

不幸的是,這兩種類型唯一共同的祖先是System.Object,這意味着我不能爲任一的抽象創建可重用的實用程序代碼。

爲什麼API是這種方式?我錯過了兩者之間有什麼重要的區別?

+0

我剛剛用'Request'和'RequestBase'找到了同樣的模式。是否有兩個平行版本的基礎API片段? – 2011-03-27 06:38:43

回答

82

在ASP.NET MVC對經典HttpContext對象的抽象中引入了Request,Response和Session。它們表示抽象類,並且暴露於整個MVC框架中以隱藏底層的上下文並簡化單元測試,因爲抽象類可以被嘲笑。

例如對於會話對象,您有HttpSessionStateBase及其實現HttpSessionStateWrapper

下面是如何將經典的ASP.NET會話和抽象之間進行轉換的例子:

HttpSessionStateBase session = new HttpSessionStateWrapper(HttpContext.Current.Session); 

所以,你指的是System.Web.SessionState.HttpSessionState是曾經存在過,因爲經典的ASP.NET的基本會話對象1.0。在MVC中,這個對象被包裝成一個HttpSessionStateWrapper。但是,由於ASP.NET MVC是一個ASP.NET應用程序,您仍然可以獲得Global.asax,其中包含裸會話。

+6

優秀的答案Darin!非常感謝你。 – 2011-03-27 09:11:40

+1

您也可以創建'新的HttpRequestWrapper(HttpContext.Current.Request)'和'新的HttpResponseWrapper(HttpContext.Current.Response)'。 – 2016-04-06 21:45:48