说我有对象A,其具有类型对象B的成员,..和对象B具有Object类型的构件C..NET序列化和高速缓存问题
对象A很少变化,但被读取很频繁,而对象C经常这样做。缓存对象A是有意义的,但是当它被序列化进入缓存时,显然会将整个图表序列化。
情景: 对象A从数据库和填充阅读。对象C的变量被访问并延迟加载。为了举例,C.Status在业务逻辑中被引用,并且具有值ACTIVE。我将A.Name更改为“New Name”,并提交给数据库和缓存。
对象C(从代码别的地方)有它的状态改为挂起。
- 此时我应该使对象A的缓存无效? *
如果我做的:
如果(A.B.C.Status == ACTIVE) SendLotsOfMoney(A)
这会通过,因为整个图形序列化。
如果C.Status勤换我不想保持的高速缓存失效,因为我可能会经常提到A.Name,A.Status等,并且不希望保留命中数据库。
我想我的选择是: 1)在对象中有一个标志,它来自缓存,并强制重新载入所有的依赖关系,如果它已经被引用并且它们被引用(延迟重载它们) 。无论如何,这些可能来自缓存......但是当时我的缓存中仍然有很多毫无意义的存储数据。
2)保持无效缓存。很明显,如果我有A.B.C.D.E.F.G.Status和A.H.I.J.K.Status等,那么我会一直在重新创建A?
3)我重写OnDeserialization和做的是在(1)
4)我重写OnSerialization并设置所有引用为空(所以他们延迟加载,而不是存储在哪里?)
我m有兴趣听到答复。我倾向于4
问候!
你不应该违反德米特法! – jason 2010-01-02 13:22:34
这可能是真的,但我继承了另一个系统,并且存在与往返于DB的性能问题 – sjhuk 2010-01-02 13:45:44