2010-06-21 20 views
8

Tengo varias variables que debo enviar de página en página ... ¿Cuál es la mejor manera de hacerlo?ASP.NET; Varias variables de sesión o un "objeto contenedor"?

Sólo hay que enviar uno por uno:

string var1 = Session["var1"] == null ? "" : Session["var1"].ToString(); 
int var2 = Session["var2"] == null ? 0 : int.Parse(Session["var2"].ToString()); 

y así sucesivamente ...

O poner a todos en algún tipo de recipiente a objetos?

struct SessionData 
{ 
    public int Var1 { get; set; } 
    public string Var2 { get; set; } 
    public int Var3 { get; set; } 
} 

-

SessionData data = Session["data"] as SessionData; 

¿Cuál es la mejor solución? ¿Que usas?

+0

5 respuestas en 5 minutos ... Me encanta SO: D –

Respuesta

6

Un híbrido de los dos es el enfoque más sostenible. El Session ofrece una tienda de par de clave-valor flexible de baja impedancia, por lo que sería un desperdicio no aprovecharlo. Sin embargo, para datos complejos que son siempre relacionados entre sí, por ejemplo, un perfil de usuario, tiene sentido tener un objeto profundamente anidado.

+0

Pero, ¿por qué no simplemente almacenar el ID de usuario o de perfil en la sesión y utilizar la base de datos para el resto? –

+3

Porque entonces usted incurre en el gasto del golpe DB cada vez, que es posiblemente el área más lenta del código. – JustLoren

0

No creo que haya creado un objeto solo para agrupar otros objetos para el almacenamiento en una sesión, así que probablemente vaya con la primera opción. Dicho esto, si tiene una cantidad tan grande de objetos que necesita agruparlos para que sea más fácil trabajar con ellos, es posible que desee volver a examinar su arquitectura.

2

Si todos los datos que usted está almacenando en la Sesión se relaciona, entonces sugeriría consolodating en un solo objeto, como su segundo ejemplo:

public class UserData 
{ 
    public string UserName { get; set; } 
    public string LastPageViewed { get; set; } 
    public int ParentGroupId { get; set; } 
} 

y luego cargar todo de una vez y almacenarla para su La sesión.

Sin embargo,, no recomendaría agrupar datos de sesión no relacionados en un solo objeto. Rompería cada grupo separado de elementos relacionados en el suyo. El resultado sería algo así como un término medio entre los dos enfoques de línea dura que proporcionó.

0

He usado ambos. En general, muchos nombres de variables de sesión generan una posibilidad de colisión, lo que hace que las colecciones sean más confiables. Asegúrese de que el contenido de la colección se relacione con una sola responsabilidad, tal como lo haría con cualquier objeto. (De hecho, los objetos de negocio son excelentes candidatos para los objetos de sesión.)

Dos consejos:

definir todos los nombres de sesión como variables de sólo lectura estáticos públicos, y convertirlo en un estándar de codificación a utilizar sólo estas variables estáticas Al escribir el nombre de sesión datos.

En segundo lugar, asegúrese de que cada objeto esté marcado con el atributo [Serializable]. Si alguna vez necesita guardar el estado de la sesión fuera de proceso, esto es esencial.

1

utilizo un SessionHandler, que es una clase personalizada laminado que tiene este aspecto

public static class SessionHandler 
{ 
    public static string UserId 
    { 
     get 
     { 
      return Session["UserId"]; 
     } 
     set 
     { 
      Session["UserId"] = value; 
     } 
    }  
} 

Y luego en código hago

var user = myDataContext.Users.Where(u => u.UserId = SessionHandler.UserId).FirstOrDefault(); 
+0

Si va a utilizar este método, asegúrese de dejar en claro que los datos se guardan en la sesión. De lo contrario, para otros consumidores de la clase, el comportamiento parecerá extraño cuando la sesión se borre. –

+1

Esperemos que el nombre * Session * Handler lo aclare;) – JustLoren

0

La gran ventaja de un objeto: propiedades son strongly- mecanografiado.

Cuestiones relacionadas