限制条件:
1.此客户端是使用Silverlight编写的。
2.对象本身不是很大(约15个值类型和字符串属性),但查询所有数据很昂贵。这15个属性包含来自各种来源的数据;没有聪明的连接语句或索引可以加速查询。我考虑仅在初始加载时填充部分属性,然后在用户缩放到给定对象组的情况下填充更昂贵的详细信息。类似于Google地图,但它显示的是对象而不是街道和建筑物。
3.我将能够限制正在更新的成千上万个对象的部分。但是,我需要用户能够从允许粒度更新的上下文“缩小”到显示所有数千个对象的上下文。当对象离开足够的缩放上下文时,更新将再次被禁用。
如何解决这个问题的想法?就像我提到的那样,我已经考虑了一些想法,但是到目前为止,没有任何东西让我对此项目的成功有信心。
我认为最困难的部分可以归结为两个方面,可能需要两种不同的模式/实践/策略:
- 通过互联网加载大量记录(约5k)。
- 通过互联网保持这些对象的子集(约500)更新。
对于其他所有内容,都可以使用几种设计模式。
编辑2:
感谢提供有关Silverlight中各种“推”实现的链接。 我发誓套接字已经从Silverlight中删除,但在下面的答案中找到了基于Silverlight 3的参考。 对我来说,这真的不是一个很大的问题,而且我没有花太多时间研究它,因此我正在编辑原始文本。 无论更新是通过轮询还是通过推送传输,一般的设计问题仍然存在。 很高兴知道我有选择的余地。
编辑3:有关推送技术的后续
正如我所怀疑的那样,Silverlight WCF双工实现类似于comet-like push。 这不会扩展,并且有许多关于它在现实世界中不起作用的文章。
Silverlight中的套接字实现有几个缺陷。 由于Web服务器可能位于任何给定的客户端防火墙后面,不允许非标准端口,并且Silverlight套接字无法连接到80、443等端口,因此看起来它将在我们的场景中没有用处。
我仍在考虑以有限的方式使用WCF双工方法,但轮询似乎是答案。
编辑4:找到解决我的问题一半的模式
我发现了一个名为此模式(PDF)的模式,它展示了如何使用迭代器模式从服务器检索数据页面并将其呈现为简单的迭代器。在 .Net 领域中,我想这将被实现为 IEnumerable(样本代码是基于 Java 和 Oracle SQL)。特别让我感兴趣的是异步页面预取功能,即在客户端缓冲结果集。由于 5k 个对象无法一次性放到屏幕上,所以我可以使用一种策略来不获取全部内容,但又能隐藏该实现细节以避免影响 UI。应用程序将检索核心对象存储在数据库中,然后需要其他查找才能完全填充这些对象。这种方法似乎是快速将某些数据传输到客户端的好方法。我现在正在考虑使用此模式 + 某种代理对象模式来监听结果集的增量,并相应地更新对象。这里有几种可行的策略。我可以预先加载所有数据,然后发送更改的增量(这可能需要子系统中的一些额外代码来提供更改通知)。这可能是我的第一个尝试。我还在寻找其他方案。谢谢至今提供的所有想法。