2012-08-04 12 views
5

Z pewnością musi to być typowy problem, ale nie mogę znaleźć łatwego sposobu na zrobienie tego.Asp.net globalna zmienna specyficzna dla cyklu życia strony?

Czy istnieje sposób na udostępnienie zmiennej globalnej (np. Klasa, która jest droga do utworzenia wystąpienia) w cyklu życia formularza internetowego asp.net, bez konieczności przekazywania uchwytu do każdego elementu strony?

Jeśli po prostu utworzę zmienną statyczną, będzie ona dostępna dla wszystkich wątków w domenie aplikacji (problem: moja klasa nie jest bezpieczna dla wątków) i trudno będzie zapewnić, że każda strona będzie działać na ostatniej kopii (Chcę buforować klasę na każdym etapie cyklu życia strony, ale chcę nowej instancji za każdym razem, gdy wywoływana jest nowa strona).

Alternatywą jest przekazanie uchwytu przez każdy element kontrolny na stronie, ale między stroną wzorcową, samą stroną i wszystkimi kontrolkami użytkownika powoduje to, że kod jest dość owłosiony.

Zastanawiam się, czy nie było eleganckiego rozwiązania do przechowywania klasy w miejscu, które jest dostępne tylko dla wątku wykonującego tę konkretną stronę (w tym wszystkie kontrolki użytkownika podrzędnego)?

Wszelkie sugestie mile widziane! Dzięki Charles

Odpowiedz

7

Istnieje prosta odpowiedź: pojemnik Elementy. Jest dostępny przez całe życie pojedynczego żądania, a następnie jest automatycznie niszczony. Można owinąć je w nieruchomości, aby mieć co chcesz:

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

a następnie

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

Nicea rozwiązanie! Skutecznie mogę mieć funkcję statyczną Foo.Current, która przechodzi do httpcontext, sprawdza, czy instancja foo już tam jest, w przeciwnym razie tworzy ją i dodaje ją, i zwraca tę instancję. Dziękuję za szybką odpowiedź! – Charles

+0

Tylko dlatego, że inni mogą natknąć się na tę odpowiedź ... jeśli w metodzie zestawu zmiennych użyjesz HttpContext.Current.Items [SOMEKEY] = value; to stworzy element, jeśli go tam nie ma, lub zresetuje jego wartość, jeśli już tam jest. Nie ma potrzeby przekodowywania, gdy klasa słownika już to zrobi. – AgapwIesu

Powiązane problemy