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 项目
确保没有将任何日志条目(创建或修改文件)写入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对象,当然,除非您处理掉它。