2009-06-08 5 views
0

J'ai séparé toutes les interactions de session directe en une classe distincte et je l'ai rendue statique, car je ne voulais pas créer plusieurs fois un nouvel objet. Cependant, je souhaite m'assurer qu'il n'y a pas de problèmes de concurrence ou d'autres surprises.Gestion des sessions d'emballage dans la classe statique

Voici le 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; 
    } 

} 

Répondre

1

S'il y avait des problèmes fonctionnels avec cela, de nombreuses applications aurait échoué il y a longtemps :)

Cependant, je tiens à souligner que ce modèle est pas très bon pour les tests unitaires. Vous pouvez envisager de créer les membres d'instance de méthodes et de passer un fournisseur de session dans le constructeur de cet objet HttpHelper.

+0

Merci Rex, je peux le faire. Pour autant que ce modèle va bien. Je voulais juste confirmer que les variables de session ne seront pas partagées entre les utilisateurs, je veux m'assurer que la session est unique pour chaque utilisateur. – sarsnake

1

Voici une réponse d'une question similaire qui peut vous aider - il vous permettra d'éviter d'utiliser les touches pour accéder aux valeurs de session tout à fait et vous donner typées propriétés:

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

+0

Le prix dans ce cas que je dois créer une propriété pour chaque var, je vais m'en tenir aux clés. – sarsnake

+0

@gnomixa Votre raisonnement semble étrange. Le coût de création d'une propriété pour chacun de vos objets de session sera toujours inférieur au coût de création d'une faute de frappe dans les clés de votre dictionnaire. "onglet onglet prop" fait! – jfar

+0

Lisez mes commentaires à d'autres réponses: Je stocke les clés dans une classe statique, donc je ne tape pas de chaînes magiques. La conversion de type est une toute autre affaire bien que lol – sarsnake

0

Conceptuellement, vous ça devrait aller. Même dans un scénario de postback partiel (EG, AJAX) où vous pourriez vous attendre à des conditions de course, vous devriez être OK. L'état de session utilise un reader/writer lock pour vous protéger.

J'ai tendance à faire quelque chose de similaire dans mes projets, même si je suis un fan de l'encapsulation des entrées de session valides (clés, etc.) dans les propriétés. Je trouve qu'il maintient le code de l'application plus cohérent, et - plus important encore - supprime la possibilité d'une faute de frappe sur une chaîne de clé magique qui rendrait l'application se comporter de façon inattendue.

Si vous faites quelque chose de similaire pour l'état de l'application, vous devez vous assurer que vous verrouillez et déverrouillez les valeurs avant de les définir.

+0

je stocke les clés, donc pas de chaînes magiques. Merci! – sarsnake

0

Je ne sais pas est ce wrapper utile, mais je pense que vous pourriez faire les améliorations suivantes lieu de

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

vous pouvez utiliser

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

La même méthode pour Post. Et est-il vrai que votre méthode Session renvoie uniquement une chaîne, si vous pouvez stocker un objet en session par la méthode StoreInSession?

+0

J'ai changé la session pour retourner le type d'objet, cependant, ce n'est pas ma question originale. S'il vous plaît restez sur la cible. Merci! – sarsnake

Questions connexes