Синглтон работает на веб-приложениях Asp.Net - PullRequest
5 голосов
/ 10 декабря 2010

У меня есть вопрос о синглетонах, запущенных в IIS (6,7,7.5) и веб-приложении ASP.NET 4.0 (приложение MVC3, в частности).

У меня есть одноэлементный объект в моем проекте, которыйДоступ и использование в global.ascx, на application_start, а также в некоторых других местах приложения.

Меня беспокоит, что этот синглтон должен быть доступен в каждом сценарии.Однако, поскольку IIS, по сути, является процессом хостинга, будет ли синглтон одним и тем же объектом во всех экземплярах приложения?

Если я использую ключевое слово [ThreadStatic], будет ли он разделяться на уровне пула приложений?

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

Надеюсь, это достаточно ясно,Если вы хотели увидеть одноэлементный объект, я вставил общую идею ниже.

public sealed class Singleton : IDisposable
{
    [ThreadStatic]
    private static volatile Singleton _instance;
    [ThreadStatic]
    private static readonly object _syncRoot = new object();

    public bool IsReleased { get; private set; }

    public Singleton()
    {
        IsReleased = false;
    }

    public static Singleton Instance
    {
        get
        {
            if (_instance == null)
            {
                lock (_syncRoot)
                {
                    if (_instance == null)
                        _instance = new Singleton();
                }
            }

            return _instance;
        }
    }

    public void Dispose()
    {
        IsReleased = true;
        Singleton._instance = null;
    }
}

Ответы [ 3 ]

3 голосов
/ 10 декабря 2010

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

Подробнее см. http://msdn.microsoft.com/en-us/library/2bh4z9hs(v=vs.71).aspx

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

0 голосов
/ 10 декабря 2010

Если вы абсолютно хотите, чтобы они были отдельными, вы можете запустить каждый из них в своем собственном пуле приложений.Таким образом, вы получите WP для каждого виртуального каталога.

0 голосов
/ 10 декабря 2010

С IIS вы не можете контролировать поток, в котором выполняется ваш запрос.Если вам действительно требуется блокировка на уровне экземпляра приложения такого типа, вы можете изучить более сложные блокирующие объекты (Mutex, Monitor и т. Д.) И создать их для каждого приложения.

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