2008-11-19 2 views
4

Я создал класс реестра в .NET, который является одноэлементным. По-видимому, этот синглтон ведет себя так, как если бы он хранился в кэше (для каждого сеанса доступен одноэлементный объект). Является ли это хорошей практикой, следует ли добавить этот синглтон в кэш? + нужен ли мне для решения проблемы параллелизма с функцией GetInstance()?Singleton vs Cache ASP.NET

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; 
     } 
    } 
} 

ответ

0

я бы это нравится:

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

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

5

Ну, ваш метод GetInstance конечно не поточно- - если два потока называют его в то же время, они вполне могут в конечном итоге с двумя различными экземплярами. У меня есть page on implementing the singleton pattern, если это помогает.

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

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

+0

Yeps, когда AppDomain перезагружается, новый экземпляр не представляет проблемы. Но синглтон ведет себя как глобальный объект, нет? При тестировании я вижу, что ASP.NET не создает одноэлемент для каждого сеанса, а просто одноэлемент для всего приложения. – 2008-11-19 15:37:14

5

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

+0

Это хорошая практика при использовании в нужном месте. К сожалению, я НИКОГДА не работал в месте, которое действительно * необходимо *, хотя я видел, как они были реализованы сотни раз :) MonoState - хорошая альтернатива. – 2008-11-19 14:41:53

+0

Действительно, и дискуссии об этом сотней в Интернете ... – 2008-11-19 15:41:45

0

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

2

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

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

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