ASP .NET应用程序生命周期+单例实例生命周期

时间:2012-01-11 14:49:37

标签: asp.net singleton lifecycle object-lifetime

请考虑以下情况:

  1. 我使用ASP .NET MVC 3框架创建了一个完整的Web应用程序。现在我的应用程序由Web服务器管理。
  2. 在我的应用程序的服务器端收到HTTP请求。
  3. 实现单例设计模式的类在服务器端实现。
  4. 将响应发送到浏览器。
  5. 在我的应用程序的服务器端收到另一个HTTP请求。在步骤2中使用的单例实例是否仍在服务器端可用?
  6. 我在此页面上阅读了有关ASP .NET应用程序生命周期的一些信息:http://msdn.microsoft.com/en-us/library/ms178473.aspx

    但我仍然无法回答我的问题。

    提前感谢您将来的帮助


    我刚刚在VS2010下进行了一些测试。

    以下是我项目的主要组成部分列表:

    • 包含Index HttpGet操作方法的Home控制器。
    • “索引”操作方法产生的视图。
    • 实现单例设计模式的SingletonTest类。

    以下是SingletonTest类的代码:

    public class SingletonTest
    {
        private int counter;
        private static SingletonTest instance = null;
    
        public int Counter
        {
            get
            {
                return counter;
            }
        }
    
        public static SingletonTest Instance 
        {
            get 
            {
                if (instance == null)
                    instance = new SingletonTest();
    
                return instance;
            }
        }
    
        private SingletonTest() 
        {
            counter = 0;
        }
    
        public void IncrementCounter()
        {
            counter++;
        }
    }
    

    以下是Index操作方法的代码:

    public ActionResult Index()
    {
        SingletonTest st = SingletonTest.Instance;
        st.IncrementCounter();
    
        return View();
    }
    

    以下是视图的代码:

    @SingletonTest.Instance.Counter
    

    这是我遵循的测试场景:

    1. IIS服务器已由VS2010自动启动。
    2. 我已请求/ Home / Index / URL,然后显示值1。
    3. 我已经请求了/ Home / Index / URL,然后显示了值2.
    4. ...
    5. 此测试显示在处理下一个请求时,步骤1中生成的SingletonTest实例可用。 我想在服务器上为我的Web应用程序分配了一个内存空间。

      然后我停止了IIS服务器,我再次关注了我的测试场景。 我得到了与以前相同的结果:1,2,....

2 个答案:

答案 0 :(得分:0)

即使单例可能会在多个请求中持续存在,但您需要注意第二次测试的原因 - 当IIS重新启动或应用程序池被回收时,一切都将丢失。

确定你需要一个单例实例吗?

如果您希望在所有请求中保持某种状态,最好使用外部存储,例如数据库。

答案 1 :(得分:0)

IIS将创建哪个应用程序的多个实例来处理并发请求?

如果IIS在高流量情况下创建同一应用程序的多个实例,我认为单例对象不会相同