web-dev-qa-db-fra.com

Stockage d'objets personnalisés dans les sessions

Quelle est la façon générale de stocker des objets personnalisés dans les sessions. Je prévois de garder mon panier en session tout au long de l'application Web. Lorsque cet utilisateur se déconnecte, la session est effacée.

Class ShoppingCart {
private List<CartItem> Items = new List<CartItem>();

    public ShoppingCart()
    {
            this.Items = new List<CartItem>();
            if (HttpCurrent.Current["Cart"]!=null])
            {
                this.Items = ShoppingCart.loadCart(HttpCurrent.Current["User"]);
            }

    }
}

Lorsque l'utilisateur se connecte, je place le panier dans une session comme

Session["Cart"] = new ShoppingCart();

Mais dois-je écrire Session ["Cart"] sur chaque page. N'y a-t-il pas un moyen plus simple de le faire? Qu'en est-il également de la session de panier d'invité? Où vais-je déclarer cela?

Je veux que chaque session utilisateur soit stockée dans une session unique. Pour qu'il n'y ait aucun mélange entre la session invité et la session membre.

31
user478636

La session ASP.NET correspond à la session du navigateur - elle est indépendante du fait que l'utilisateur soit authentifié (connecté) ou non. Vous ne devriez donc avoir aucun problème en ce qui concerne les sessions invité/membre. Je vous conseille d'exposer le panier actuel via la propriété d'accesseur statique - par exemple

Class ShoppingCart {

    public static ShoppingCart Current
    {
      get 
      {
         var cart = HttpContext.Current.Session["Cart"] as ShoppingCart;
         if (null == cart)
         {
            cart = new ShoppingCart();
            HttpContext.Current.Session["Cart"] = cart;
         }
         return cart;
      }
    }

... // rest of the code

}

Peu de choses à considérer ici:

  1. Chaque fois qu'une application Web ou un serveur Web recycle/redémarre, vos sessions en cours sont perdues. Cela signifie que vous devez conserver votre session dans la base de données au moment approprié.
  2. Vous pouvez utiliser le stockage de session hors processus (base de données ou serveur différent) - vous devez marquer votre classe de panier comme sérialisable dans ce cas. Il y a un coût de performance pour les sessions hors processus. En tant que tel, vous stockez déjà la session dans la base de données, donc IMO, vous devez utiliser des sessions in-proc en vous assurant d'écrire des sessions sales dans la base de données dès que possible.
39
VinayC

Ajoutez-le à une page maître ou vous pouvez ajouter une propriété statique à votre objet ShoppingCart

public static ShoppingCart GetCurrent
{
    get
    {
        if(HTTPContext.Current.Session["CurrentCart"] == null)
        {
            HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();
        }
        return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;
    }
}
4
Dan

Définition de la méthode d'extension générique dans une classe statique:

public static T GetSession<T>(string key) =>  HttpContext.Current?.Session?[key] != null ? (T)HttpContext.Current.Session[key] : default(T);

exemple d'utilisation implicite

var myCart = GetSession<ShoppingCart>("myKey");

inférence

ShoppingCart myCart2 = GetSession("myKey");

vérifier s'il existe

if(myCart != default(ShoppingCart)){
    // do stuff
}
0
Mike