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

ASP.NET 中的静态方法存在问题

摆脱静态变量并将其存储在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应用程序的情况下影响所有用户,逻辑是当您使变量成为静态时,则在服务器中分配一个内存位置,当分配此位置时,所有用户共享该位置只是因为它是静态的。