ASP.NET 中的静态方法存在问题
本文关键字:存在 问题 静态方法 NET ASP | 更新日期: 2023-09-27 17:56:26
我对 ASP.NET 中的静态方法有问题。我在下面创建了单例。在执行过程中,我将多次调用 Context.getInstance(),我需要相同的上下文值。但是,一旦我向服务器发出另一个请求(Get,Post,无论在哪里),我就需要一个新的上下文,因为我的上下文依赖于.NET HttpContext。但是,不幸的是,一旦我第一次调用getInstance,该类将永远不会再次实例化。
任何想法如何解决这个问题?
public class Context
{
private static Context _context = null;
private Context()
{ ... }
public static Context getInstance()
{
if (Context._context == null)
_context = new Context();
return _context;
}
}
摆脱静态变量并将其存储在HttpContext.Current.Items
中。
public static Context GetInstance()
{
if (HttpContext.Current.Items["MyContext"] == null)
{
HttpContext.Current.Items["MyContext"] = new Context();
}
return (Context)HttpContext.Current.Items["MyContext"];
}
如果我
理解正确,您只需要在单个页面请求中提供上下文,对吗?如果是这样,上面的方法肯定是行不通的 - 静态将在应用程序域的生命周期内存在。此生命周期可能因多种因素而异。我将首先创建一个基页面类(继承自核心 ASP.NET Page类),并在其上包含一个Context属性。由于该页面仅"存活"于一个请求,因此应该对您有用。
另一种方法 - 我更喜欢使用我自己的 ThreadStatic 变量 (ala HttpContext.Current),而不是仅仅因为我认为(一种观点)它会使代码更干净。扬子晚报.
public class Context
{
[ThreadStatic()]
private static Context _Context = null;
private HttpContext _HttpContext = null;
public Context()
{
_HttpContext = HttpContext.Current;
}
public static Context Current
{
if(_Context == null ||
_HttpContext != _HttpContext.Current)
{
_Context = new Context();
}
return _Context;
}
}
如果您的变量是静态的,那么所有用户都将访问相同的变量,并且对该变量的任何更改都将仅在Web应用程序的情况下影响所有用户,逻辑是当您使变量成为静态时,则在服务器中分配一个内存位置,当分配此位置时,所有用户共享该位置只是因为它是静态的。