ASP.NET中的缓存模式

时间:2020-03-05 18:44:42  来源:igfitidea点击:

所以我只是修复了我正在开发的框架中的错误。伪伪代码如下所示:

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也会更改引用的缓存对象,因此它永远也不会保存回数据库。我通过从缓存版本中克隆对象,切断了引用并允许我将新对象与缓存对象进行比较来解决此问题。

我的问题是:有没有更好的方法可以建议这样做?我不能成为唯一做过此事的人:)

解决方案

回答

我做过类似的事情,但是我也通过克隆解决了它。区别在于我让缓存进行了克隆。将对象放入高速缓存时,高速缓存将首先克隆对象并存储克隆的版本(这样,我们就可以对原始对象进行突变而不会破坏高速缓存)。当我们从缓存中获取对象时,缓存将返回对象的克隆,而不是存储的对象(再次使调用者可以对对象进行突变而不会影响缓存的/规范的对象)。

我认为只要我们存储/复制的数据很小,这是完全可以接受的。

回答

我认为,脏跟踪是处理此问题的正常方法。就像是:

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();