Шаблоны кеширования в ASP.NET - PullRequest
       47

Шаблоны кеширования в ASP.NET

14 голосов
/ 29 августа 2008

Итак, я только что исправил ошибку в разрабатываемой платформе. Псевдопсевдокод выглядит так:

myoldObject = new MyObject { someValue = "old value" };
cache.Insert("myObjectKey", myoldObject);
myNewObject = cache.Get("myObjectKey");
myNewObject.someValue = "new value";
if(myObject.someValue != cache.Get("myObjectKey").someValue)
     myObject.SaveToDatabase();

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

Мой вопрос: Есть ли лучший способ сделать это, какой-нибудь шаблон, который вы могли бы порекомендовать? Я не могу быть единственным человеком, который делал это раньше:)

Ответы [ 3 ]

23 голосов
/ 29 августа 2008

Грязное слежение - нормальный способ справиться с этим, я думаю. Что-то вроде:

class MyObject {
  public string SomeValue { 
     get { return _someValue; }
     set { 
       if (value != SomeValue) {
          IsDirty = true;
          _someValue = value;
       }
  }

  public bool IsDirty {
     get;
     private set;
  }

  void SaveToDatabase() {
     base.SaveToDatabase(); 
     IsDirty = false;
  }
}

myoldObject = new MyObject { someValue = "old value" };
cache.Insert("myObjectKey", myoldObject);
myNewObject = cache.Get("myObjectKey");
myNewObject.someValue = "new value";
if(myNewObject.IsDirty)
   myNewObject.SaveToDatabase();
1 голос
/ 23 февраля 2012

Небольшое улучшение в Marks anwser при использовании linq:

При использовании Linq выборка объектов из БД помечает каждый объект как IsDirty. Я сделал обходной путь для этого, не устанавливая IsDirty, когда значение не установлено; для этого экземпляра: когда ноль. Для целочисленных значений я присвоил значение оригинала -1, а затем проверил его. Однако это не будет работать, если сохраненное значение совпадает с неинициализированным значением (в моем примере это значение равно нулю).

private string _name;
[Column]
public string Name
{
    get { return _name; }
    set
    {
        if (value != _name)
        {
            if (_name != null)
            {
                IsDirty = true;   
            }
            _name = value;
        }
    }
}

Вероятно, может быть улучшено путем установки IsDirty после инициализации.

1 голос
/ 29 августа 2008

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

Я думаю, что это вполне приемлемо, если данные, которые вы храните / дублируете, невелики.

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