Синглтон против Cache ASP.NET - PullRequest
4 голосов
/ 19 ноября 2008

Я создал класс Registry в .NET, который является одноэлементным. Очевидно, этот синглтон ведет себя так, как если бы он хранился в кэше (объект синглтона доступен для каждого сеанса). Это хорошая практика, если я должен добавить этот синглтон в кэш? + нужно ли выводить проблемы параллелизма с помощью функции GetInstance ()?

namespace Edu3.Business.Registry
{
    public class ExamDTORegistry
    {
        private static ExamDTORegistry instance;
        private Dictionary<int, ExamDTO> examDTODictionary;

        private ExamDTORegistry()
        {
            examDTODictionary = new Dictionary<int, ExamDTO>();
        }

        public static ExamDTORegistry GetInstance()
        {
            if (instance == null)
            {
                instance = new ExamDTORegistry();
            }
            return instance;
        }
    }
}

Ответы [ 6 ]

5 голосов
/ 19 ноября 2008

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

5 голосов
/ 19 ноября 2008

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

Ваш код полагается на то, что он является одиночным? Имейте в виду, что если перезагрузить AppDomain, вы все равно получите новый экземпляр.

Хотя я не вижу особой пользы от помещения объекта в кеш. Есть ли что-то, о чем вы думаете, в частности?

2 голосов
/ 19 ноября 2008

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

HttpContext.Application также доступен для всех сессий и является хорошим местом для хранения постоянных объектов всего приложения.

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

0 голосов
/ 27 декабря 2018

Я думаю, что первоначальный вопрос говорил, который был предпочтительным. Если у вас есть данные, которые остаются статичными или по существу неизменными, то кеширование http или шаблон синглтона имеет большой смысл. Если синглтон загружается при запуске приложения, то проблема «Threading» вообще отсутствует. Как только синглтон будет установлен, вы получите тот же экземпляр, который вы запрашивали. Проблема с тем, что я вижу в реальных реализациях, заключается в том, что люди используют оба, не продумывая их полностью. Зачем вам истекать неизменные данные конфигурации? Был один клиент, который кешировал данные и все еще создавал объекты ADO DB и т. Д., Когда последний раз проверял, был ли он в кеше. По сути, оба эти решения будут работать на вас, но чтобы получить какой-либо положительный эффект, обязательно используйте кеш / синглтон. В любом случае, если ваши данные недоступны, оба должны быть обновлены в этот момент.

0 голосов
/ 12 февраля 2009

я бы сделал так:

частный статический экземпляр READONLY ExamDTORegistry;

тогда вам не нужно проверять NULL и его потокобезопасность.

0 голосов
/ 19 ноября 2008

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

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