Singleton и HttpApplicationState

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

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

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

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

8
задан Prabhu 1 February 2010 в 20:43
поделиться

3 ответа

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

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

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

7
ответ дан 5 December 2019 в 17:37
поделиться

Если вы планируете реализовать его как Singleton, , согласно Jon Skeet (ака 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;
        }
    }
}
2
ответ дан 5 December 2019 в 17:37
поделиться

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

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

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

1
ответ дан 5 December 2019 в 17:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: