假设我有一个Object A,其成员类型为Object B ..而Object B的成员类型为Object C.
对象非常小的更改但是经常读取,而对象C经常这样做。缓存对象A是有意义的,但是当它被序列化以进入缓存时,显然会将整个图形序列化。
方案: 从数据库中读取对象A并填充。访问并延迟加载Object C类型的变量。为了示例,在业务逻辑中引用了C.Status,其值为ACTIVE。我将A.Name更改为“New Name”,并提交到数据库和我的缓存。
对象C(来自代码中的其他位置)将其状态更改为SUSPEND。
如果我这样做:
如果(A.B.C.Status == ACTIVE) SendLotsOfMoney(A)
这将通过,因为整个图表是序列化的。
如果C.Status频繁更改,我不想让A的缓存无效,因为我可能经常引用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并将所有引用设置为null(因此它们是延迟加载而不是存储?)
我很想听听回复。我倾向于4
问候!
答案 0 :(得分:1)
当C发生变化时,您是否有办法将A.B中对C的引用更改为null?然后,不要使所有A无效,只需将C引用设置为null,并在需要时再次对其进行延迟加载。
或者,您可以单独从A和B缓存C.在A.B而不是对C的引用中,您可以保留缓存键。然后,您可以在需要时使C无效,并使用缓存键来检索和/或延迟加载它,
答案 1 :(得分:0)
我在想,当我将项目添加到缓存时,我会将数据对象标记为“BeenCached”,然后当对象需要再次加载各种属性时,它将检查第一个的缓存标志检查它的各个ReloadedFromCache标志并填充它(可能从缓存或数据库中重新填充)。
应该可以正常工作。因为对象在其他地方被序列化/反序列化,所以我不会进行序列化/反序列化路由。