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