web-dev-qa-db-ja.com

セッションにカスタムオブジェクトを保存する

セッションにカスタムオブジェクトを格納する一般的な方法。私はカートをWebアプリケーション全体のセッションで保持することを計画しています。そのユーザーがログアウトすると、セッションはクリアされます。

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();

しかし、すべてのページにSession ["Cart"]を書く必要がありますか。これを行う簡単な方法はありませんか?ゲストカートセッションについてはどうですか?どこで宣言しますか?

各ユーザーセッションを一意のセッションに保存する必要があります。そのため、ゲストセッションとメンバーセッションの間に問題が発生することはありません。

31
user478636

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. WebアプリケーションまたはWebサーバーがリサイクル/再起動するたびに、インプロセスセッションが失われます。これは、適切な時点でデータベースにセッションを保持する必要があることを意味します。
  2. アウトプロセスセッションストレージ(データベースまたは別のサーバー)を使用できます。このような場合、ショッピングカートクラスをシリアル化可能としてマークする必要があります。アウトプロセスセッションにはパフォーマンスコストがかかります。そのため、すでにデータベースにセッションを保存しているため、IMOでは、インプロセスセッションを使用して、できるだけ早くダーティセッションをデータベースに書き込む必要があります。
39
VinayC

マスターページに追加するか、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

静的クラスの汎用拡張メソッド定義:

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

暗黙的な使用例

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

推論

ShoppingCart myCart2 = GetSession("myKey");

存在するかどうかを確認する

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