2009-06-08 7 views
0

Ich habe alle direkte Sitzung Interaktion in eine separate Klasse und machte es statisch, weil ich nicht ein neues Objekt mehrmals erstellen wollte. Ich möchte jedoch sicherstellen, dass es keine Nebenläufigkeitsprobleme oder andere wackelige Überraschungen gibt. HierWrapping-Session-Behandlung in der statischen Klasse

ist der Code:

public static class HttpHelper 
{ 

    public static string Get(string key) 
    { 
     object value = HttpContext.Current.Request.QueryString[key]; 
     return (value == null) ? null : value.ToString(); 
    } 


    public static string Post(string key) 
    { 
     object value = HttpContext.Current.Request.Form[key]; 
     return (value == null) ? null : value.ToString(); 
    } 

    public static string Session(string key) 
    { 
     object value = HttpContext.Current.Session[key]; 
     return (value == null) ? null : value.ToString(); 
    } 

    public static void ClearSession(string key) 
    { 
     HttpContext.Current.Session[key] = null; 
    } 

    public static void StoreInSession(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 

} 

Antwort

1

Wenn es irgendwelche funktionelle Probleme waren mit diesem, würden viele Anwendungen längst versagt haben :)

Allerdings möchte ich darauf hinweisen, dass dieses Modell nicht sehr gut für Unit-Tests. Sie könnten in Betracht ziehen, die Methodeninstanzmitglieder zu erstellen und einen Sitzungsanbieter in den Konstruktor dieses HttpHelper-Objekts zu übergeben.

+0

Danke Rex, ich darf das tun. Soweit dieses Modell geht. Ich wollte nur bestätigen, dass die Sitzungsvariablen nicht zwischen den Benutzern geteilt werden. Ich möchte sicherstellen, dass die Sitzung für jeden Benutzer eindeutig ist. – sarsnake

1

Hier ist eine Antwort von einer ähnlichen Frage, die Ihnen helfen können - es Ihnen ermöglichen, mit den Tasten zu vermeiden insgesamt die Sitzungswerte zuzugreifen und sie typsicher Eigenschaften geben:

How to access session variables from any class in ASP.NET?

+0

Der Preis in diesem Fall, dass ich eine Eigenschaft für jeden var erstellen muss, werde ich mit Schlüsseln bleiben. – sarsnake

+0

@gnomixa Ihre Argumentation scheint seltsam. Die Kosten für das Erstellen einer Eigenschaft für jedes Ihrer Sitzungsobjekte sind immer niedriger als die Kosten für einen Tippfehler in Ihren Wörterbuchschlüsseln. "Requisiten Registerkarte" fertig! – jfar

+0

Lesen Sie meine Kommentare zu anderen Antworten: Ich speichere die Schlüssel in einer statischen Klasse, daher gebe ich keine magischen Zeichenfolgen ein. Type Conversion ist eine ganz andere Sache, obwohl lol – sarsnake

0

Konzeptionell Sie sollte gut sein. Selbst in einem Partial-Postback-Szenario (EG, AJAX), bei dem Sie mit Rennbedingungen rechnen können, sollten Sie in Ordnung sein. Der Sitzungsstatus verwendet eine reader/writer lock, um Sie zu schützen.

Ich tendiere dazu, in meinen Projekten etwas Ähnliches zu tun, obwohl ich ein Fan davon bin, die tatsächlich gültigen Sitzungseinträge (Schlüssel usw.) in Eigenschaften einzukapseln. Ich finde, dass es den App-Code konsistenter hält und - was noch wichtiger ist - die Möglichkeit eines Tippfehlers in einer Zauberschlüsselzeichenfolge beseitigt, die die App auf völlig unerwartete Weise zum Verhalten führen würde.

Wenn Sie etwas ähnliches für den App-Status tun, müssen Sie sicherstellen, dass Sie Werte sperren und entsperren, bevor Sie sie setzen.

+0

ich die Schlüssel speichern, also keine Zaubersprüche. Vielen Dank! – sarsnake

0

ich nicht sicher bin, ist dieser Wrapper nützlich, aber ich denke, Sie könnten die folgenden Verbesserungen tun Statt

public static string Get(string key) 
{ 
    object value = HttpContext.Current.Request.QueryString[key]; 
    return (value == null) ? null : value.ToString(); 
} 

Sie

public static string Get(string key) 
{ 
    return HttpContext.Current.Request.QueryString[key]; 
} 

Das gleiche gilt für Post-Methode verwenden können. Und ist es wahr, dass Ihre Session-Methode nur einen String zurückgibt, wenn Sie ein beliebiges Objekt in der Sitzung mit der StoreInSession-Methode speichern können?

+0

Ich habe die Sitzung geändert, um den Objekttyp zurückzugeben, dies ist jedoch nicht meine ursprüngliche Frage. Bitte bleib beim Ziel. Vielen Dank! – sarsnake