2011-03-27 7 views
56

veo dos formas de trabajar con los datos de sesión en ASP.NET MVC:¿Por qué hay dos tipos de estado de sesión incompatibles en ASP.NET?

  • System.Web.SessionState.HttpSessionState, disponible en HttpApplication
  • System.Web.HttpSessionStateBase, disponible en Controller

Los datos almacenados en una parece ser disponible en el otro.

Desafortunadamente, el único ancestro común de estos dos tipos es System.Object, lo que significa que no puedo crear código de utilidad reutilizable para la abstracción de ninguno de ellos.

¿Por qué es la API de esta manera? ¿Hay alguna diferencia importante entre los dos que me estoy perdiendo?

+0

Acabo de encontrar el mismo patrón con 'Request' y' RequestBase'. ¿Hay dos versiones paralelas de las piezas API básicas? –

Respuesta

82

En abstracciones de ASP.NET MVC sobre los objetos clásicos de HttpContext Solicitud, respuesta, sesión se introdujeron. Representan clases abstractas y están expuestas en todo el marco de MVC para ocultar el contexto subyacente y simplificar las pruebas unitarias porque las clases abstractas pueden ser burladas.

Por ejemplo, para el objeto de sesión que tiene HttpSessionStateBase y su implementación HttpSessionStateWrapper.

Aquí hay un ejemplo de cómo convertir entre la sesión ASP.NET clásica y la abstracción:

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

Así que la System.Web.SessionState.HttpSessionState la que usted se refiere es el objeto de sesión subyacente que existía desde que ASP.NET clásico 1.0. En MVC este objeto está envuelto en un HttpSessionStateWrapper. Pero dado que ASP.NET MVC es una aplicación ASP.NET, aún obtienes Global.asax en el que tienes la sesión vacía.

+6

Excelente respuesta Darin! Muchas gracias. –

+1

También puede crear 'new HttpRequestWrapper (HttpContext.Current.Request)' y 'new HttpResponseWrapper (HttpContext.Current.Response)'. –

Cuestiones relacionadas