在多个用户中使用“动态”静态属性?

时间:2014-04-03 20:49:39

标签: c# asp.net webforms static session-variables

我试图了解做一个动态的问题是否有任何问题。静态属性。比如,我有一个ASP.NET Webforms应用程序来处理公司中的员工。为了这个问题,我们可以说这个应用程序只针对一家公司。

假设有一个名为Employee的类。它包含一个静态属性。

public static string CompanyName = "My Company";

现在,如果我使用CompanyName,网站上的任何地方都将为所有用户显示相同的公司名称。真正的静态用法。

现在假设我将另一个属性定义为(假设这是为了便于在整个网站上使用,所以你可以Employee.LoggedIn。)

public static Employee LoggedIn
{
   get 
   {
     return Session["LoggedInEmployee"] As Employee;
   }
}

这将根据用户连接到站点的内容为不同的员工返回不同的值。这是否意味着每个用户都有这个变量的副本?我知道这可以按预期工作,但只是想知道这样做是否安全。

编辑 - 我没有找到更好的方法来做到这一点。我只想了解静态属性如何保存不同的值。有人评论说'得到'是一个方法,但该属性仍然表示为静态。

2 个答案:

答案 0 :(得分:1)

public static string CompanyName = "My Company";

除了IoC容器,日志记录或缓存之外,我们通常不会在ASP.Net中使用Singleton。

public Employee static LoggedIn
{
   return Session["LoggedInEmployee"] As Employee;
}

以上代码甚至无法编译。

  

这将根据不同的员工返回不同的值   用户连接到网站的用户。这是否意味着有一份副本   这个变量适合每个用户?我知道这可以按预期工作,但只是   想知道这样做是否安全。

根据您的问题,您希望整个应用程序都可以使用LoggedInEmployee。

如果我正确理解您的问题, LoggedInEmployee 是当前登录员工的信息。如果是这样,则不应与其他已登录的员工共享。

由于是每个登录的员工信息,我将通过存储在HttpContext中使用替代方法,该方法仅适用于当前登录的员工。

public class MyContext
{
    private MyUser _myUser;

    public static MyContext Current
    {
        get
        {
            if (HttpContext.Current.Items["MyContext"] == null)
            {
                MyContext context = new MyContext();
                HttpContext.Current.Items.Add("MyContext", context);
                return context;
            }
            return (MyContext) HttpContext.Current.Items["MyContext"];
        }
        }

        public MyUser MyUser
        {

            get { return _myUser; }
            set { _myUser = value; }
        }
    }
}

Global.asax中

void Application_AuthenticateRequest(object sender, EventArgs e)
{
    if (HttpContext.Current.User != null && 
        HttpContext.Current.User.Identity.IsAuthenticated)
    {
        MyContext.Current.MyUser = 
           YOURCODE.GetUserByUsername(HttpContext.Current.User.Identity.Name);
    }
}

用法

var user = MyContext.Current.MyUser;

##返回原始问题##

public static class EmployeeHelper {
   public static Employee LoggedIn {
      get { return HttpContext.Current.Session["LoggedInEmployee"] as Employee; }
   }
}

以上方法很好。只要你不这样做 -

public static class EmployeeHelper {
   // ===== Bad approach =====
   private static HttpSessionState _session = HttpContext.Current.Session;
   public static Employee LoggedIn {
      get { return _session["LoggedInEmployee"] as Employee; }
   }
}

答案 1 :(得分:-1)

这实际上是ASP.NET MVC处理其部分代码的方式。例如,当您执行HttpContext.Current时,它会执行与LoggedIn调用非常类似的操作。它是一个静态属性,取决于调用它的当前请求生命周期。我不会担心它,因为static强制执行一个引用,但该引用的值可以是特定于上下文的,类似于ThreadStaticAttribute