我在ASP.NET中遇到静态方法的问题。我在下面创建了Singleton。在执行过程中,我将多次调用Context.getInstance(),我需要相同的上下文值。但是,一旦我向服务器发出另一个请求(Get,Post,where),我需要一个新的上下文,因为我的上下文依赖于.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;
}
}
答案 0 :(得分:4)
删除静态变量并将其存储在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"];
}
答案 1 :(得分:0)
如果我理解正确,您只需要在单个页面请求中使用上下文,对吗? 如果是这样,上面的方法肯定是行不通的 - 静态将在app域的生命周期中存在。这种寿命可能因许多因素而异。 我将首先创建一个基页类(继承自核心ASP.NET Page类)并在其上包含Context属性。由于页面仅为一个请求“生命”,这应该适合您。
答案 2 :(得分:0)
另一种方法 - 我更喜欢使用我自己的ThreadStatic变量(ala HttpContext.Current)而不是使用HttpContext Items集合,因为我认为(一种观点)它使代码更清晰。 YMMV。
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;
}
}
答案 3 :(得分:0)
如果你的变量是静态的,那么所有用户都将访问同一个变量,对于该变量的任何更改都会影响所有用户,仅限于web应用程序,逻辑是当你将变量设为静态然后分配内存位置时在服务器中,当分配此位置时,所有用户只共享该位置,因为它是静态的。