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