ASP.NET中的静态方法问题

时间:2011-05-16 04:04:03

标签: c# asp.net static

我在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;
   }
}

4 个答案:

答案 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应用程序,逻辑是当你将变量设为静态然后分配内存位置时在服务器中,当分配此位置时,所有用户只共享该位置,因为它是静态的。