использование синглтона для кеширования - PullRequest
6 голосов
/ 28 августа 2011

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

class SomeClass
{
   public SomeClass()
   {
       var somedata = Singleton.Instance.GetSomeData(stringRepresintation); // or like that
       var someData = Singleton.Instance.SomeData;
   }      
}

Каков рекомендуемый дизайн для хранения этих данных (статический класс или что-то еще)?

Ответы [ 2 ]

5 голосов
/ 28 августа 2011

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

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

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

2 голосов
/ 28 августа 2011

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

Это позволит заменить другой механизм кэширования (или просто разные экземпляры кэша) без каких-либо изменений SomeClass.

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