我试图了解做一个动态的问题是否有任何问题。静态属性。比如,我有一个ASP.NET Webforms
应用程序来处理公司中的员工。为了这个问题,我们可以说这个应用程序只针对一家公司。
假设有一个名为Employee的类。它包含一个静态属性。
public static string CompanyName = "My Company";
现在,如果我使用CompanyName,网站上的任何地方都将为所有用户显示相同的公司名称。真正的静态用法。
现在假设我将另一个属性定义为(假设这是为了便于在整个网站上使用,所以你可以Employee.LoggedIn
。)
public static Employee LoggedIn
{
get
{
return Session["LoggedInEmployee"] As Employee;
}
}
这将根据用户连接到站点的内容为不同的员工返回不同的值。这是否意味着每个用户都有这个变量的副本?我知道这可以按预期工作,但只是想知道这样做是否安全。
编辑 - 我没有找到更好的方法来做到这一点。我只想了解静态属性如何保存不同的值。有人评论说'得到'是一个方法,但该属性仍然表示为静态。
答案 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; }
}
}
}
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