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 回答