Как Singleton Pattern работает в веб-области? - PullRequest
2 голосов
/ 10 октября 2011

Я знаю, как работает шаблон Singleton, но я сомневаюсь, как он работает в веб-области. Разве не по запросу?

Запрос сделан, экземпляр синглтона создан и запрос завершен. Синглтон был уничтожен? Если да, почему некоторые люди делают так, чтобы синглтон явно указывал в области запроса Если нет, что происходит? Одиночка остается в памяти, и для каждого запроса создается новый?

Обновление:

Когда я говорю «почему некоторые люди делают так, чтобы синглтон явно указывал в области запроса», например, использую Ninject, я должен это сделать:

Bind<ISession>().To(SessionSingleton.Instance).InRequestScope();

Обновление 2:

using System;

public class Singleton
{
   private static Singleton instance;

   private Singleton() {}

   public static Singleton Instance
   {
      get 
      {
         if (instance == null)
         {
            instance = new Singleton();
         }
         return instance;
      }
   }
}

Обновление 3:

Мой DbContext - это Синглтон? Я думаю, нет, мой DbContextFactory одноэлементный, НО мой DbContext в этом случае будет уничтожен, когда запрос закончится?

public class DbContextFactory
{
    #region Fields

    private static volatile DbContextFactory _dbContextFactory;
    private static readonly object SyncRoot = new Object();
    public DbContext Context;

    #endregion

    #region Properties

    public static DbContextFactory Instance
    {
        get
        {
            if (_dbContextFactory == null)
            {
                lock (SyncRoot)
                {
                    if (_dbContextFactory == null)
                        _dbContextFactory = new DbContextFactory();
                }
            }
            return _dbContextFactory;
        }
    }

    #endregion

    #region Methods

    public DbContext GetOrCreateContext()
    {
        if (this.Context == null)
            this.Context = new DbContext(ConfigurationManager.AppSettings["DefaultConnectionString"]);

        return Context;
    }

    #endregion
}

Ответы [ 2 ]

2 голосов
/ 10 октября 2011

Даже в контексте веб-приложения есть объекты с глобальной областью действия. Одним из них является System.Web.HttpApplication, который создается фреймворком. Также статические экземпляры имеют глобальную область видимости. Время жизни этих глобальных объектов привязано к времени жизни вашего приложения (не веб-запроса). Фреймворк может остановить и запустить ваше приложение (подумайте об утилизации пула приложений).

В контексте веб-приложения синглтоны также имеют глобальную область видимости, поэтому они привязаны к времени жизни приложения и не будут уничтожаться в конце каждого запроса. Они могут быть уничтожены и воссозданы при перезапуске веб-приложения, но это не должно отражаться на вашем приложении.

Также, чтобы завершить то, что сказали другие, это правда, что синглтоны, как правило, являются злыми, и вы должны дважды подумать, прежде чем создавать что-то как синглтон, за исключением случаев, когда они именно то, что вам нужно. Некоторыми примерами, в которых вы можете захотеть убедиться, что у вас есть только один экземпляр, являются журналирование, кэширование, фабрика сеансов NHibernate и другие сквозные компоненты инфраструктуры, а также модели для ресурсов, которые существуют как только один экземпляр.

0 голосов
/ 10 октября 2011

Как сказал Рейнос: синглеты являются злом.

Но, отвечая на ваш вопрос, синглтон не застаивается и не уничтожается при каждом запросе, но остается в памяти и распределяется междувсе запросы вне зависимости от того, когда запрос сделан.

Я не совсем понимаю, что вы подразумеваете под , почему некоторые люди делают так, чтобы синглтон явно входил в область запроса? .Вы говорите о специальных рамках?(почему-то у меня такое чувство, что ты говоришь о весне).Можете ли вы привести пример того, что вы имеете в виду?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...