Хранение пользовательских объектов в сессиях - PullRequest
31 голосов
/ 13 апреля 2011

Какой общий способ хранения пользовательских объектов в сессиях.Я планирую держать свою корзину в сеансе через веб-приложение.Когда этот пользователь выходит из системы, сеанс будет очищен.

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

    }
}

Когда пользователь входит в систему, я помещаю корзину в сеанс, как

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

Но я должен написатьСессия ["Корзина"] на каждой странице.Нет ли более простого способа сделать это?А как насчет сеанса гостевой корзины?Где я это объявлю?

Я хочу, чтобы каждый пользовательский сеанс хранился в уникальном сеансе.Так что между гостевым сеансом и сеансом участника не будет путаницы.

Ответы [ 3 ]

39 голосов
/ 13 апреля 2011

Сеанс ASP.NET соответствует сеансу браузера - он не зависит от того, аутентифицирован ли пользователь (вошел в систему) или нет. Таким образом, у вас не должно быть никаких проблем с гостями / участниками. Я бы посоветовал вам выставить текущую корзину с помощью свойства статического доступа - например,

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

}

Несколько вещей, которые следует учитывать здесь:

  1. Всякий раз, когда веб-приложение или веб-сервер перезапускается / перезапускается, ваши незавершенные сеансы будут потеряны. Это означает, что вам нужно сохранить сеанс в базе данных в соответствующую точку.
  2. Вы можете использовать хранилище сеансов вне процесса (база данных или другой сервер) - в этом случае вы должны пометить класс корзины покупок как сериализуемый. Производительность вне сеансов снижается. Таким образом, вы уже храните сеанс в базе данных, поэтому IMO следует использовать внутрипроцессные сеансы, чтобы записывать грязные сеансы в базу данных как можно скорее.
4 голосов
/ 13 апреля 2011

Добавьте его на главную страницу или вы можете добавить статическое свойство в свой объект 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;
    }
}
0 голосов
/ 25 марта 2019

Определение общего метода расширения в статическом классе:

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

пример использования неявное

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

1007 * умозаключение *

ShoppingCart myCart2 = GetSession("myKey");

проверить, если существует

if(myCart != default(ShoppingCart)){
    // do stuff
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...