2012-08-04 29 views
5

Seguramente debe ser un problema común, pero no puedo encontrar una manera fácil de hacerlo.Asp.net página variable global específica del ciclo de vida?

¿Hay alguna manera de compartir una variable global (digamos una clase que es cara de crear instancias) durante el ciclo de vida de un formulario web asp.net, sin tener que pasar el control a cada componente de la página?

Si acabo de crear una variable estática, todos los subprocesos del dominio de la aplicación podrán acceder a ella (problema: mi clase no es segura para subprocesos) y será difícil garantizar que todas las páginas funcionen en una copia reciente (Quiero guardar en caché la clase en cada paso del ciclo de vida de la página, pero quiero una nueva instancia cada vez que se llame a una nueva página).

La alternativa es pasar un control a través de cada control en la página, pero entre la página maestra, la página misma y todos los controles del usuario, hace que el código sea bastante peludo.

Me preguntaba si no había una solución elegante para almacenar una clase en algún lugar al que solo se puede acceder mediante el hilo que ejecuta esta página en particular (incluidos todos los controles secundarios del usuario).

Cualquier sugerencia bienvenida! Gracias Charles

Respuesta

7

Hay una respuesta simple: el contenedor de Elementos. Está disponible durante el tiempo de vida de una única solicitud y luego se destruye automáticamente. Se puede envolver en una propiedad de tener lo que quiere:

public class Foo { 

    const string SOMEKEY = "_somekey"; 

    public static string SingleRequestVariable 
    { 
     get 
     { 
      return (string)HttpContext.Current.Items[SOMEKEY]; 
     } 
     set 
     { 
      HttpContext.Current.Items.Add(SOMEKEY, value); 
     } 
    } 
} 

y luego

Foo.SingleRequestVariable = "bar"; // somewhere 
... 
string val = Foo.SingleRequestVariable; // yet somewhere else 
+0

buena solución! Efectivamente, puedo tener una función estática Foo.Current que va dentro de httpcontext, comprueba si una instancia de foo ya está allí, de lo contrario crea una y la agrega, y devuelve esta instancia. ¡Gracias por la rápida respuesta! – Charles

+0

Solo porque otros puedan tropezar con esta respuesta ... si en el método de conjunto de variables, usa HttpContext.Current.Items [SOMEKEY] = value; entonces eso creará un elemento si no está allí o restablecerá su valor si ya está allí. No es necesario recodificar eso cuando la clase de diccionario ya lo hace por usted. – AgapwIesu

Cuestiones relacionadas