6
votes

Sessions fortement typées dans ASP.NET

Pardonnez-moi si cette question a déjà été posée. httpcontext.current.session ["clé"] renvoie un objet et nous devrions le jeter à ce type de type avant que nous puissions l'utiliser. Je examinais diverses implémentations de sessions typées

http://www.codeproject.com /Kb/aspnet/typedsessionState.aspx http: // weblogs .asp.net / Cstewart / Archive / 2008/01/09 / Fortement-Tapé-Session-Session-In-ASP-NET.ASPX http://geekswithblogs.net/dlussier/archive/2007/12/24 /117961.aspx

Et j'ai senti que nous devions ajouter un autre code (corrigez-moi si j'étais tort) à la sessionManager si nous voulions ajouter un nouveau type de l'objet dans la session, en tant que méthode ou en tant que wrapper séparé. Je pensais que nous pourrions utiliser des génériques xxx

  • y a-t-il un avantage inhérent à en utilisant

    sessionManager .getsession ("sessionstring")

    que d'utiliser xxx

    • Je pensais aussi que ce serait bien avoir quelque chose comme

      sessionManager ["SessionsRing"] = objtostoreinsession , Mais j'ai constaté qu'une classe statique ne peut pas avoir d'indexeur. Y a-t-il une autre façon d'y parvenir?

      • Ma pensée a été créée un sessionObject qui stockerait le type et l'objet, puis ajoutez cet objet à la session (à l'aide d'un sessionManager), avec la clé. Lorsque vous récupérez, jetez tous les objets à sessionObject , obtenez le type (selon T) et l'objet (Say Obj) et lancer obj comme t et renvoyez-le.

        Session de classe publique { type de type public {get; set;} objet public obj {get; set;}
        }

        Cela ne fonctionnerait pas également (car la signature de retour serait identique, mais les types de retour seront différents).

        existe une autre manière élégante de sauver / récupérer des objets en session de manière plus sûre de type


0 commentaires

5 Réponses :


1
votes

En réalité, si vous cherchiez à taper des objets, placez le type au niveau de la méthode comme:

public class SessionManager
{
    private static SessionManager _instance = null;


    public static SessionManager Create()
    {
       if (_instance != null)
           return _instance;

       //Should use a lock when creating the instance
       //create object for _instance

       return _instance;
    }

    public object this[string key] { get { .. } }
}


0 commentaires

4
votes

Pour une manière très propre, maintenable et slick de traiter de la session, regardez ce POST . Vous serez surpris à quel point il peut être simple.


4 commentaires

Bien qu'un bon post, dériver votre classe d'une classe spécifique à une session ne vous laisserait pas dériver votre classe d'une autre classe de classe abstraite / base


@RAM Oui, le point de la classe dans mon poste est qu'il s'agit d'une enveloppe pour tous les articles que vous souhaitez stocker en session. Et comme j'espère que vous avez remarqué, cela ne pourrait vraiment pas être plus facile.


Est-ce que cela fonctionnera vraiment pour l'état de la procédure? Étant donné que l'objet de session n'est jamais revenu au magasin de session, le magasin de session aura donc toujours les valeurs précédemment sérialisées précédemment.


@TheObjectGuy Le lien de votre réponse semble être mort.



2
votes

Un inconvénient de la technique est que le code consommateur doit être conscient de quelles clés à utiliser pour le stockage et la récupération. Cela peut être sujet aux erreurs, car la clé doit être exactement correcte, sinon vous risquez de stocker au mauvais endroit ou de récupérer une valeur null.

J'utilise réellement la variation dactylographiée forte, car je sais ce que je dois avoir à la session et peut ainsi configurer la classe d'emballage en fonction. J'ai plutôt le code supplémentaire dans la classe de session et ne pas avoir à vous soucier des cordes clés ailleurs.


1 commentaires

Yup, d'accord avec vous. Je vois que la mise en place de sessionManager.Constants pour les chaînes de session en tant que mise en œuvre standard pour éviter les fautes de frappe



2
votes

Vous pouvez simplement utiliser un modèle singleton pour votre objet de session. De cette façon, vous pouvez modéliser toute votre session à partir d'un seul objet structure composite. Cet article fait référence à ce dont je parle et discute de l'objet de session comme un objet faiblement dactylographié: http://allthingscs.blogspot.com/2011/03/documing-software-architectural.html


0 commentaires

0
votes

J'ai posté une solution sur la question Stackoverflow Est-il une bonne idée de créer une énumération pour les noms de clés des valeurs de session?

Je pense que c'est vraiment slick et contient très peu de code pour y arriver. Il a besoin de .NET 4.5 comme le slickest, mais est toujours possible avec des versions plus anciennes.

Il permet: xxx

fonctionner exactement comme: xxx


0 commentaires