Singleton и HttpApplicationState - PullRequest
       16

Singleton и HttpApplicationState

8 голосов
/ 01 февраля 2010

В веб-приложении мне нужен только один экземпляр класса с именем ProcessManager. Один из способов - сделать его синглтоном. Другой способ - использовать HttpApplicationState, чтобы убедиться, что я всегда обращаюсь к одному и тому же экземпляру, например так:

public static ProcessManager ProcessManager
        {
            get 
            {
                HttpApplicationState applicationState = HttpContext.Current.Application;
                if (applicationState["ProcessManager"] == null)
                {
                    applicationState["ProcessManager"] = new ProcessManager();
                }

                return (ProcessManager)applicationState["ProcessManager"];
            }
        } 

Какой метод лучше и почему?

Ответы [ 3 ]

7 голосов
/ 01 февраля 2010

Исходя из приведенного вами ограниченного описания, я бы выбрал Singleton, поскольку тогда он не зависит от HttpContext.Current и может использоваться вне конвейера ASP.Net (например, когда вы хочу написать модульные тесты.)

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

Альтернативно, разрешите внедрение HttpContext при создании ProcessManager, чтобы вы могли использовать его с имитированным HttpContext.

2 голосов
/ 01 февраля 2010

если вы планируете реализовать его как singleton, согласно Джону Скиту (a.k.a C # гуру), он лично предпочитает код ниже

public sealed class Singleton
{
    static readonly Singleton instance=new Singleton();

    // Explicit static constructor to tell C# compiler
    // not to mark type as beforefieldinit
    static Singleton()
    {
    }

    Singleton()
    {
    }

    public static Singleton Instance
    {
        get
        {
            return instance;
        }
    }
}
1 голос
/ 01 февраля 2010

(я предполагаю, что ваш конструктор ProcessManager является личным.)

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

Только если существует фактический вариант использования для существования нескольких экземпляров класса, имеет смысл разрешить несколько экземпляров, полагаясь на соглашение для защиты экземпляра в HttpApplicationState.

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