Подтвердить что ты не робот

Как модели singleton работают в веб-контексте?

Итак, объект, который использует шаблон singleton, может иметь только один экземпляр. Как это работает на веб-сайтах?

Вопросы:

  • Является ли одиночный объект уникальным для каждого клиента/посетителя веб-сайта? Т.е. если объекты singleton получают один экземпляр PER-клиента?
  • Объекты в веб-приложениях сохраняются только в течение нескольких секунд, поэтому, если два клиента будут одновременно получать доступ к веб-сайту, оба клиента будут пытаться создать одноэлементный объект. Означает ли это, что у кого-то есть исключение, которое будут видеть посетители? Я пробовал искать, но не мог найти прямой ответ. Я просто ищу немного разъяснений.
4b9b3361

Ответ 1

Стив, я постараюсь ответить на каждый из ваших вопросов:

1) Для веб-разработки очень часто имеют объекты, привязанные к веб-запросу (иногда это также называют "для каждого контекста запроса" или "для контекста HTTP" ), но мы обычно не ссылаемся на эти как одноточие для этой точной причины. У большинства контейнеров МОК фактически есть область "для каждого запроса", встроенная в них из коробки, а также "singleton".

2) Обычно обычно имеют настоящие синглтоны для веб-приложения (доступ ко всем запросам). Как уже упоминалось выше, это не совсем так, потому что оно будет ограничено пулом приложений и будет сбрасываться при перезапуске пула приложений. Но это одноэлемент для целей веб-приложения. Как отметил Джигар, иногда "сквозные проблемы", такие как каротаж и т.д., Настраиваются таким образом. Обычно они не инициализируются в каждом веб-запросе, а вместо этого в global.asax или полагаются на контейнер IOC, чтобы сделать это за вас. Вы просто должны быть уверены, что при создании объекта используется один из стандартных шаблонов блокировки, чтобы предотвратить одновременное создание двух потоков/клиентов/и т.д. Здесь ссылка от Microsoft, но есть и другие реализации: http://msdn.microsoft.com/en-us/library/ff650316.aspx Если вы используете один из популярных контейнеров IOC, это займет забота об этом для вас (Structuremap, Windsor, Autofac, Unity, Ninject... и многие другие).

Вам нужно спросить своих коллег, к которым они обращаются, потому что они действительны в определенных ситуациях и очень распространены.

Ответ 2

Все зависит от вашей реализации singleton. Здесь я предполагаю, что вы создаете синглоны как статические поля, инициализированные в статических конструкторах.

Теоретически в зависимости от его настроек IIS может создавать несколько процессов для вашего приложения, и каждый процесс может создавать несколько потоков для обработки запросов. Каждый процесс будет иметь свои собственные синглтоны, которые могут быть совместно использованы несколькими потоками (и несколькими запросами). Но в то же время на одном сервере может быть несколько экземпляров "одиночных" (по одному для каждого процесса) (но, если я правильно понимаю, несколько процессов могут быть запрещены в настройках IIS).

Если вы используете статические конструкторы, тогда синглтоны будут созданы при первом доступе к вашему классу поточно-безопасным способом. См. Безопасен ли поток статического конструктора С#?

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

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

Ответ 3

Синглтон поддерживается IIS, поэтому singleton длится до тех пор, пока пул приложений IIS. Когда это будет переработано или IIS будет reset, тогда синглтон исчезнет. Вам нужно будет заблокировать singleton для множественного доступа. Как и в любом другом клиентском сервере.

Как правило, я стараюсь избегать этого, поскольку это похоже на идею того, что веб-сайт является, по существу, асинхронным клиентским серверным приложением. Почему бы просто не использовать сеанс для хранения каких-либо общих данных?

Ответ 4

Хорошо для журнала и общих ресурсов мы можем использовать singleton в веб-приложениях точно. И как сказал Лиам, они остаются, пока ваш пул приложений не очищается.

Для лучшего понимания посетите... http://www.oodesign.com/singleton-pattern.html

Спасибо