Шаблон Singleton в постоянном кэше в памяти

Используя то, что я считал лучшим из всех миров в замечательной статье Реализация шаблона Singleton в C # , я с успехом использовал следующий класс для сохранения пользовательских данных в память (для очень редко изменяемых данных):

public class Params
{
  static readonly Params Instance = new Params();

  Params()
  {
  }

  public static Params InMemory
  {
    get
    {
      return Instance;
    }
  }

  private IEnumerable _localizations;

  public IEnumerable Localizations
  {
    get
    {
      return _localizations ?? (_localizations = new Repository().Get());
    }
  }

  public int ChunkSize
  {
    get
    {
      // Loc uses the Localizations impl
      LC.Loc("params.chunksize").To();
    }
  }

  public void RebuildLocalizations()
  {
    _localizations = null;
  }

  // other similar values coming from the DB and staying in-memory,
  // and their refresh methods

}

Мое использование будет выглядеть примерно так:

var allLocs = Params.InMemory.Localizations; //etc

Всякий раз, когда я обновляю базу данных, вызывается RefreshLocalizations, поэтому перестраивается только часть моего хранилища в памяти. У меня есть единственная производственная среда из 10, которая кажется некорректно ведет себя при вызове RefreshLocalizations, не обновляясь вообще, но это также кажется прерывистым и очень странным в целом .

Мои текущие подозрения относятся к синглтону, который, как мне кажется, отлично справляется со своей задачей, и все модульные тесты доказывают, что механизм синглтона, механизм обновления и производительность ОЗУ работают должным образом.

Тем не менее, я ограничиваюсь следующими возможностями:

  1. Этот клиент лжет, когда говорит, что его среда не использует балансировку нагрузки, а это настройка, я не ожидаю, что содержимое в памяти будет работать должным образом (верно? )
  2. В их IIS есть нестандартная конфигурация пула, с которой я тестирую (возможно, в настройках веб-сада?)
  3. Синглтон каким-то образом не работает, но не знаю, как это сделать.

Есть предложения?

.NET 3.5 , так что не так много параллельного сока, и пока он не готов к использованию реактивных расширений

Edit1: согласно предложениям, получатель будет выглядеть примерно так:

public IEnumerable Localizations
{
  get
  {
    lock(_localizations) {
      return _localizations ?? (_localizations = new Repository().Get());
    }
  }
}

5
задан Francisco Aquino 11 January 2012 в 15:27
поделиться