2009-06-08 13 views
0

新しいオブジェクトを何度も作成したくないため、すべての直接セッションのやりとりを別々のクラスに分けて静的にしました。しかし、私は並行性の問題や他の驚くべき驚きがないことを確認したい。ここで静的クラス内でのラッピングセッション処理

はコードです:

public static class HttpHelper 
{ 

    public static string Get(string key) 
    { 
     object value = HttpContext.Current.Request.QueryString[key]; 
     return (value == null) ? null : value.ToString(); 
    } 


    public static string Post(string key) 
    { 
     object value = HttpContext.Current.Request.Form[key]; 
     return (value == null) ? null : value.ToString(); 
    } 

    public static string Session(string key) 
    { 
     object value = HttpContext.Current.Session[key]; 
     return (value == null) ? null : value.ToString(); 
    } 

    public static void ClearSession(string key) 
    { 
     HttpContext.Current.Session[key] = null; 
    } 

    public static void StoreInSession(string key, object value) 
    { 
     HttpContext.Current.Session[key] = value; 
    } 

} 

答えて

1

これに任意の機能の問題があった場合には、多くのアプリケーションはずっと前に失敗しただろう:)

をしかし、私はこのモデルが非常にではないことを指摘するだろうユニットテストに適しています。メソッドのインスタンスメンバーを作成し、セッションプロバイダをこのHttpHelperオブジェクトのコンストラクタに渡すことを検討するとよいでしょう。

+0

ありがとうRex、私はそれをするかもしれません。 このモデルには限りません。私は、セッション変数がユーザー間で共有されないことを確認したかったので、セッションが各ユーザーに固有であることを確認したいと思います。 – sarsnake

1

ここであなたを助けるかもしれない同様の質問から答えだ - それは完全にセッションの値にアクセスするためのキーを使用しないようにできますし、あなたのタイプセーフな特性与える:概念的

How to access session variables from any class in ASP.NET?

+0

この場合の価格は、すべてのvarのプロパティを作成する必要があります、私はキーに固執します。 – sarsnake

+0

@gnomixaあなたの推論は変わっているようです。セッションオブジェクトごとにプロパティを作成するコストは、常に、辞書キーの入力ミスのコストよりも低くなります。 "prop tab" – jfar

+0

他の回答に私のコメントを読む:私は静的なクラスにキーを格納しているので、私はマジック文字列を入力しないでください。タイプ変換はまったく別の問題ですが、私はキーを保存するので、魔法の文字列はありません。 – sarsnake

0

を、あなたはうまくいくはずです。競合状態が予想される部分的なポストバック(EG、AJAX)シナリオであってもOKです。セッション状態は、あなたを安全に保つためにreader/writer lockを使用します。

私は実際の有効なセッションエントリ(キーなど)をプロパティにカプセル化するファンですが、私のプロジェクトでは同様のことをする傾向があります。私はそれがアプリケーションコードをより一貫性のあるものに保つことがわかります - もっと重要なのは、アプリが驚くほど予期せぬ動作をするようなマジックキー文字列のタイプミスの可能性を排除します。

アプリ状態と同様の操作を行う場合は、設定する前に値をロックしてロックを解除する必要があります。私はわからない

+0

ありがとう! – sarsnake

0

は、このラッパー便利ですが、私はあなたが以下のような改善を行うことができ 代わり

public static string Get(string key) 
{ 
    object value = HttpContext.Current.Request.QueryString[key]; 
    return (value == null) ? null : value.ToString(); 
} 

のあなたは

public static string Get(string key) 
{ 
    return HttpContext.Current.Request.QueryString[key]; 
} 

Postメソッドで同じ使用することができると思います。 StoreInSessionメソッドによってセッション内にオブジェクトを格納できる場合、Sessionメソッドは文字列のみを返します。

+0

オブジェクトタイプを返すようにセッションを変更しましたが、これは私の最初の質問ではありません。目標にとどまってください。ありがとう! – sarsnake

関連する問題