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;
    }

}
4

4 に答える 4

1

これに機能上の問題があった場合、多くのアプリケーションはずっと前に失敗していたでしょう:)

ただし、このモデルは単体テストにはあまり適していないことを指摘しておきます。メソッドのインスタンス メンバーを作成し、Session プロバイダーをこの HttpHelper オブジェクトのコンストラクターに渡すことを検討してください。

于 2009-06-08T18:41:38.653 に答える
1

これは、同様の質問からの回答です。これにより、キーを使用してセッション値に完全にアクセスすることを回避し、タイプセーフなプロパティを提供できます。

ASP.NET の任意のクラスからセッション変数にアクセスする方法は?

于 2009-06-08T18:43:37.853 に答える
0

概念的には、問題ないはずです。競合状態が予想される部分的なポストバック (EG、AJAX) のシナリオでも、問題はありません。セッション状態では、リーダー/ライター ロックを使用して安全を確保します。

私は自分のプロジェクトで似たようなことをする傾向がありますが、実際の有効なセッション エントリ (キーなど) をプロパティにカプセル化するのが好きです。これにより、アプリ コードの一貫性が保たれ、さらに重要なことに、マジック キー文字列のタイプミスによってアプリが予想外の動作をする可能性がなくなります。

アプリの状態に対して同様のことを行う場合は、値を設定する前に値をロックおよびロック解除する必要があります。

于 2009-06-08T18:46:27.723 に答える
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 メソッドは string のみを返すというのは本当ですか?

于 2009-06-08T18:51:03.050 に答える