6

この質問がすでに行われている場合はご容赦ください。オブジェクトを返します。使用する前にHttpContext.Current.Session["key"]、そのオブジェクトをその特定のオブジェクトにキャストする必要があります。Type型付きセッションのさまざまな実装を見ていました

http://www.codeproject.com/KB/aspnet/typedsessionstate.aspx http://weblogs.asp.net/cstewart/archive/2008/01/09/strongly-typed-session-in-asp-net.aspx http://geekswithblogs.net/dlussier/archive/2007/12/24/117961.aspx

Typeまた、メソッドまたは個別のラッパーとして新しいオブジェクトをセッションに追加する場合は、SessionManagerにコードを追加する必要があると感じました(間違っている場合は修正してください) 。ジェネリックを使用できると思いました

public static class SessionManager<T> where T:class
 {
  public void SetSession(string key,object objToStore)
  {
   HttpContext.Current.Session[key] = objToStore;
  }

  public T GetSession(string key)
  {
   return HttpContext.Current.Session[key] as T;
  }

 }
  • 使用することに固有の利点はありますか

    SessionManager<ClassType>.GetSession("sessionString")

使用するより

HttpContext.Current.Session["sessionString"] as ClassType
  • 私もこういうものがあればいいなと思っていました

SessionManager["sessionString"] = objToStoreInSession、しかし、静的クラスはインデクサーを持つことができないことがわかりました。これを達成する他の方法はありますか?

  • 私の考えは、Typeとオブジェクトを格納するSessionObjectを作成し、このオブジェクトを(SessionManagerを使用して)キーを使用してSessionに追加することでした。取得するときは、すべてのオブジェクトをにキャストしSessionObject、タイプ(たとえば、t)とオブジェクト(たとえば、obj)を取得し、としてキャストobjtて返します。

    public class SessionObject { public Type type {get;set;} public Object obj{get;set;}
    }

これはうまく機能しません(戻り署名は同じですが、戻りタイプは異なります)。

よりタイプセーフな方法でセッション内のオブジェクトを保存/取得する他のエレガントな方法はありますか?

4

5 に答える 5

4

Session を処理するための非常にクリーンで、保守しやすく、洗練された方法については、この投稿を参照してください。あなたはそれがいかに簡単であるかに驚かれることでしょう。

于 2010-01-10T19:46:27.953 に答える
2

セッション オブジェクトにシングルトン パターンを使用するだけです。そうすれば、単一の複合構造オブジェクトからセッション全体をモデル化できます。この投稿では、私が話していることを参照し、Session オブジェクトを弱く型付けされたオブジェクトとして説明しています: http://allthingscs.blogspot.com/2011/03/documenting-software-architectural.html

于 2011-03-25T22:51:26.353 に答える
2

この手法の欠点は、使用するコードが、保存と取得に使用するキーを認識している必要があることです。キーが正確である必要があるため、これはエラーが発生しやすい可能性があります。そうしないと、間違った場所に保存したり、null 値を取得したりするリスクがあります。

セッションで必要なものがわかっているので、実際には厳密に型指定されたバリエーションを使用し、それに合わせてラッピング クラスを設定できます。セッション クラスに追加のコードを用意した方がよいので、他の場所のキー文字列について心配する必要はありません。

于 2010-01-11T06:44:13.770 に答える
1

実際、オブジェクトを型付けする場合は、型を次のようにメソッド レベルに配置します。

public T GetValue<T>(string sessionKey)
{

}

セッションに同じオブジェクトがある場合はクラス レベルが高くなりますが、セッションは複数のタイプに拡張できます。セッションの制御について心配するかどうかはわかりません。しばらくはそのままにして、より厳密に型指定された方法で (少なくとも消費者に) 情報を抽出して保存する手段を提供するだけです。

はい、インデックスは機能しません。代わりにインスタンスとして作成し、次の方法で静的にすることができます。

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 { .. } }
}

これは静的ファクトリの実装ですが、内部的にセッション マネージャー クラスへの静的参照を介して単一の連絡先も維持します。sessionmanager の各メソッドは、既存の ASP.NET セッションをラップするか、独自の内部ストレージを使用できます。

于 2010-01-10T05:49:44.880 に答える