【发布时间】:2012-02-08 20:02:36
【问题描述】:
我在 Web 应用程序后面使用 memcache 来最大程度地减少对我们 SQL 数据库的访问。我通过用SerializableAttribute 标记它们将C# 对象存储到这个缓存中。我们通过 Ninject 在我们的应用程序中大量使用依赖注入。
其中一些对象很大,我想将它们分解。但是,它们来自单个存储过程调用(即一个存储过程调用被烹制到完整的对象图中),我希望能够分解这些对象并分别从缓存中延迟加载特定的子图,而不是一次将整个对象图加载到内存中。
有哪些模式可以帮助我完成这项工作?
【问题讨论】:
-
我总是先咨询 Martin Fowler:martinfowler.com/eaaCatalog/lazyLoad.html
-
所以我想我的一个问题是,为什么这个对象这么大——或者更确切地说,它是如何使用的,你不能只发回完全加载的对象?它是通过服务退回还是什么?如果是这种情况,那么我认为您需要更适当地隔离这些合同,这听起来需要进行一些相当大的重构。
-
如果我理解正确,我很确定您可以使用我们的库 Patterns.NET @ www.nubilosoft.com 做到这一点。听起来就像做 Lazy
.Create(..) 一样简单,它基本上将延迟加载包装器包装在对象周围。也不确定它是否适用于此,但我也会看看 Flyweight。 -
@Sinaesthetic:在这种情况下,存储过程调用的大粒度问题反映了设计不佳的遗留模式,其修改超出了范围。
-
这个/这些对象最终是如何使用的?他们是否被排除在服务之外?我问是因为我的意思是,如果对象已经从数据库中拉出并构建,并且你缓存它,那么......它已经在那里,所以我不确定我是否看到尝试“延迟加载”某些东西的好处那已经在记忆中了。 ??