所以我刚刚修改了一个我正在开发的框架中的bug.伪伪代码如下所示:
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();