ASP.NET中的缓存模式

所以我只是在我正在开发的框架中修复了一个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();

我做了类似的事情,但我也通过克隆来解决它。 不同的是我有缓存做克隆。 当您将对象放入缓存时,缓存将首先克隆对象并存储克隆版本(这样您可以在不中毒缓存的情况下改变原始对象)。 从缓存中获取对象时,缓存将返回对象的克隆而不是存储对象(再次,以便调用方可以在不影响缓存/规范对象的情况下对对象进行变异)。

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


使用linq时Marks anwser有点改进:

使用Linq时,从数据库获取实体会将每个对象标记为IsDirty。 我为此做了一个解决方法,当值未设置时不设置IsDirty; 对于这个实例:当为null时。 对于整数,我将原始值设为-1,然后检查。 但是,如果保存的值与未初始化的值相同(在我的示例中为null),这将不起作用。

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

可能可以通过在初始化后设置IsDirty进一步改进。

链接地址: http://www.djcxy.com/p/22893.html

上一篇: Caching Patterns in ASP.NET

下一篇: Public Fields versus Automatic Properties