ASP.NET singleton的问题是什么

本文关键字:问题是 是什么 问题 NET singleton ASP | 更新日期: 2023-09-27 18:21:55

我在stackoverflow上浏览了很多链接,比如这个,这个和这个。答案表明,无论在哪里,静态变量对于整个应用程序域都是静态的。这正是我所期望的。但我观察到的行为并非如此。这是我的代码:

public static class CurrentGrid
{
    private static readonly Grid g;
    static CurrentGrid()
    {
        g = new Grid();
    }
    public static Grid Get { get { return g; } }
}

我从global.asax.cs-AppStart方法调用它,如下所示:

if (Application["CurrentGrid"] == null)
    Application["CurrentGrid"] = CurrentGrid.Get;

我只想在整个应用程序生命周期内初始化网格ONCE。但这并没有发生。每次,我都会得到一个网格对象的新实例。我试过了,用

Application["CurrentGrid"] = new Grid()

但那也没用。正如上面链接的问题中的一个答案所建议的那样,我甚至将类定义从App_Start文件夹移到了Models文件夹,但行为仍然保持不变。最后,我尝试使用一个静态构造函数来初始化Grid对象一次,但即使是这个静态构造函数也会在每次收到新请求时被激发。

此外,我看到的另一个奇怪的行为是,对每个请求也调用Application_Start()。我认为这个方法在应用程序第一次启动时只调用一次。我想,我在OOP或ASP.NET框架的一些非常基本/核心的原则上错了,因为我找不到对这种行为的任何解释。谢谢

PS:1) 只是提醒一下,我在这里的唯一目标是在整个应用程序生命周期中拥有一个单例Grid对象。2) 我在一个MVC5和SignalR应用程序中完成了所有这些(如果这很重要的话)。

PS:GDRIVE 项目

ASP.NET singleton的问题是什么

确保没有将任何日志条目(创建或修改文件)写入bin文件夹。

也许这会有所帮助?

static CurrentGrid()
{
   if(g == null)
   {
      g = new Grid();
   }
}

或者甚至更好;

public static class CurrentGrid
{
    private static readonly Grid g;
    static CurrentGrid()
    {
        //Do Grid things her
    }
    public static Grid Get { 
                              get 
                              { 
                                if(g == null)
                                { 
                                   g = new CurrentGrid(); 
                                }
                                return g; 
                              } 
                           }
}

这样做,您肯定只会得到一个Grid对象,当然,除非您处理掉它。