2012-08-04 8 views
5

Sicuramente deve essere un problema comune ma non riesco a trovare un modo semplice per farlo.Variabile globale specifica per il ciclo di vita della pagina Asp.net?

C'è un modo per condividere una variabile globale (ad esempio una classe che è costosa da istanziare) attraverso il ciclo di vita di un webform asp.net, senza dover passare l'handle a ogni singolo componente della pagina?

Se creo una variabile statica, sarà accessibile da tutti i thread nel dominio dell'app (problema: la mia classe non è protetta da thread) e sarà difficile garantire che ogni pagina funzioni su una copia recente (Voglio memorizzare nella cache la classe attraverso ogni fase del ciclo di vita della pagina, ma voglio una nuova istanza ogni volta che viene chiamata una nuova pagina).

L'alternativa è passare un handle attraverso ciascun controllo nella pagina, ma tra la pagina principale, la pagina stessa e tutti i controlli utente, rende il codice piuttosto peloso.

Mi chiedevo se non esistesse una soluzione elegante per memorizzare una classe in un posto accessibile solo al thread che esegue questa pagina particolare (compresi tutti i controlli per gli utenti secondari)?

Qualsiasi suggerimento benvenuto! Grazie Charles

risposta

7

C'è una risposta semplice: il contenitore Elementi. È disponibile per tutta la vita di una singola richiesta e quindi viene automaticamente distrutto. Si può avvolgere in una proprietà di avere ciò che si vuole:

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); 
     } 
    } 
} 

e poi

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

bella soluzione! Effettivamente posso avere una funzione statica Foo.Current che va in httpcontext, controlla se un'istanza di foo è già lì, altrimenti ne crea uno e aggiungila e restituisce questa istanza. Grazie per la risposta rapida! – Charles

+0

Solo perché altri potrebbero inciampare in questa risposta ... se nel metodo set variabile, si usa HttpContext.Current.Items [SOMEKEY] = valore; allora questo creerà un oggetto se uno non è lì o resetterà il suo valore se è già lì. Non c'è bisogno di ricodificarlo quando la classe del dizionario lo fa già per te. – AgapwIesu

Problemi correlati