2

私の asp.net MVC プロジェクトには、セッション値の設定と取得に使用するセッション ヘルパー クラスがあります。これはクラスです:

public class SessionManager
{
     public static string UserName
    {
        get
        {
            return HttpContext.Current.Session[SessConstants.UName] ;
        }
        set
        {
            HttpContext.Current.Session[SessConstants.UName] = value;
        }
    }
}

ご覧のとおり、プロパティは静的です。以下のようにコードでこれを使用します。

//For setting values    
SessionManager.UserName = "";

//For retrieving values
strLoggedinUser = SessionManager.UserName;

質問:

  1. これらのような静的プロパティは、 HttpContext.Current.Session['someVar'] に設定してもスレッドセーフですか?
  2. 代わりにインスタンス プロパティを作成し、MVC コントローラー クラスから継承したベース コントローラーで SessionManager をインスタンス化する必要があります。その後、すべてのコントローラーに、MVC コントローラーの代わりにカスタム コントローラーを継承させることができます。

考え?

御時間ありがとうございます...

4

1 に答える 1

1

ここに考えがあります。(あなたの質問に対する完全な回答ではないかもしれませんが、Maess はコメントでそれを処理したと思います。)

セッション状態変数をカプセル化する別のクラスを用意する代わりにSessionManager、拡張メソッドを使用してみませんか?

public static class SessionExtensionMethods
{
    private const string SessionUserNameKey = "UName";

    // set the session value (pass null to remove)
    public static void UserName(this HttpSessionStateBase session, string value)
    {
        if (value == null) session.Remove(SessionUserNameKey);
        else session[SessionUserNameKey] = value;
    }

    // get the session value
    public static string UserName(this HttpSessionStateBase session)
    {
        var value = session[SessionUserNameKey];
        return value != null ? value.ToString() : null;
    }
}

次に、コントローラーでこれを実行して、セッション値を取得および設定できます。

// set the value
Session.UserName("SomeUserName");

// get the value
var sessionUserName = Session.UserName();

// clear the value 
Sesssion.UserName(null);

ここでは、基本コントローラー クラスは必要ありません。必要なのは、SessionExtensionMethodsクラスが宣言されている名前空間をコントローラーが参照していることを確認することだけです。

于 2012-04-10T18:17:46.957 に答える