缓存中对象图的延迟加载部分的推荐模式

时间:2012-02-08 20:02:36

标签: c# .net ninject-2

我在web应用程序后面使用memcache来最小化对SQL数据库的命中。我将C#对象存储到此缓存中,方法是用SerializableAttribute标记它们。我们在应用程序中通过Ninject大量使用依赖注入。

其中一些对象很大,我想将它们分解。但是,它们来自单个存储过程调用(即一个存储过程调用被填充到完整的对象图中),并且我希望能够将这些对象分解并从缓存中单独延迟加载特定的子图而不是将整个对象图一次性加载到内存中。

有哪些模式可以帮助我实现这一目标?

2 个答案:

答案 0 :(得分:4)

就模式而言,我会说从单个存储过程构建的一个大型复杂对象是可疑的。我不确定您的缓存是否是一项要求,或者只是当前的实施状态。

我习惯的模式是一种存储库模式,使用填充特定合同的操作。这些操作包含一个或多个数据源,这些数据源调用数据库中的存储过程,这些数据源将用于构建您所说的子图中的一个。话虽如此,如果你要从数据库中延迟加载数据,那么我只能假设许多对象成员在很多时候都没有使用,这进一步推动了我的观点 - 打破了这个对象。

enter image description here

关于它的一些事情:

  • 如果定期使用整个对象,可能会很烦人
  • 可通过操作完全注射
  • 数据源包含特定对象的阅读器,因此只执行一个任务(SOLID)
  • 可以修改为使用实体框架,没有太多的麻烦
  • 可以设计为实现界面,使其更具可重用性
  • 将要求你将这个过程分解成更小,可咀嚼的部分,从长远来看这可能只会让你受益。
  • 如果只使用部分复杂对象,则该图中显示的复杂对象确实不存在。相反,请考虑隔离这些对象。但是,它实际上取决于该对象的使用方式。

更新:

使用您的缓存作为存储库,我可能会这样做:

enter image description here

基本上,您存储旧对象,但在您的操作中,您可以使用它们来构建更多返回给客户端的相关DTO。

答案 1 :(得分:2)

我知道NHibernate会延迟加载购买代替对象的对象。然后在代理对象中,有一种检查会在您第一次尝试访问对象时导致加载真实对象。

我不确定任何可以覆盖它的设计模式,但你可以查看Nhibernate源代码。

使用代理对象的缺点是你必须小心继承和类型检查,因为你可能检查代理的类型而不是实际的对象。