Используя то, что я считал лучшим из всех миров в замечательной статье Реализация шаблона 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, не обновляясь вообще, но это также кажется прерывистым и очень странным в целом .
Мои текущие подозрения относятся к синглтону, который, как мне кажется, отлично справляется со своей задачей, и все модульные тесты доказывают, что механизм синглтона, механизм обновления и производительность ОЗУ работают должным образом.
Тем не менее, я ограничиваюсь следующими возможностями:
Есть предложения?
.NET 3.5 , так что не так много параллельного сока, и пока он не готов к использованию реактивных расширений
Edit1: согласно предложениям, получатель будет выглядеть примерно так:
public IEnumerable Localizations
{
get
{
lock(_localizations) {
return _localizations ?? (_localizations = new Repository().Get());
}
}
}