我在web应用程序后面使用memcache来最小化对SQL数据库的命中。我将C#对象存储到此缓存中,方法是用SerializableAttribute
标记它们。我们在应用程序中通过Ninject大量使用依赖注入。
其中一些对象很大,我想将它们分解。但是,它们来自单个存储过程调用(即一个存储过程调用被填充到完整的对象图中),并且我希望能够将这些对象分解并从缓存中单独延迟加载特定的子图而不是将整个对象图一次性加载到内存中。
有哪些模式可以帮助我实现这一目标?
答案 0 :(得分:4)
就模式而言,我会说从单个存储过程构建的一个大型复杂对象是可疑的。我不确定您的缓存是否是一项要求,或者只是当前的实施状态。
我习惯的模式是一种存储库模式,使用填充特定合同的操作。这些操作包含一个或多个数据源,这些数据源调用数据库中的存储过程,这些数据源将用于构建您所说的子图中的一个。话虽如此,如果你要从数据库中延迟加载数据,那么我只能假设许多对象成员在很多时候都没有使用,这进一步推动了我的观点 - 打破了这个对象。
关于它的一些事情:
更新:
使用您的缓存作为存储库,我可能会这样做:
基本上,您存储旧对象,但在您的操作中,您可以使用它们来构建更多返回给客户端的相关DTO。
答案 1 :(得分:2)
我知道NHibernate会延迟加载购买代替对象的对象。然后在代理对象中,有一种检查会在您第一次尝试访问对象时导致加载真实对象。
我不确定任何可以覆盖它的设计模式,但你可以查看Nhibernate源代码。
使用代理对象的缺点是你必须小心继承和类型检查,因为你可能检查代理的类型而不是实际的对象。