数据驱动的Silverlight WP7应用程序的架构设计

时间:2010-12-30 04:35:09

标签: silverlight architecture windows-phone-7

我有一个Silverlight Windows Phone 7应用程序,可以从公共API中提取数据。我发现自己一遍又一遍地做同样的事情:

  • 在用户界面中,设置加载消息或加载进度条代替内容所在的位置
  • 获取可能已在内存中,缓存在隔离文件存储中或需要HTTP请求的内容
  • 如果无法获取内容(无网络连接等),则显示错误消息
  • 如果已获取内容,请在UI中显示
  • 将内容保留在主内存中以供后续查询

向用户显示的内容可以直接从数据源(例如ObservableCollection)获取,也可以是对数据源的查询。

我想把这个重复的过程分解成一个框架,理想情况下只需要指定以下内容:

  • 在UI中显示内容的位置
  • 加载,失败和成功时显示的UI元素
  • HTTP请求的URI
  • 如何将HTTP响应解析为将保留在内存中的数据结构
  • 隔离存储中文件的位置(如果存在)
  • 如何将文件内容解析为将保留在内存中的数据结构

听起来可能很多,但是两个字符串,三个FrameworkElement和两个方法比我目前的开销要少。

此外,这需要工作,但数据是在内存中维护的,并且需要在这些集合上直接收集和查询。

我的问题是:

这样的事情已经实施了吗?

我对上述话题的看法在某种程度上是根本错误的吗?

这是我想到的设计:

有两个组件,一个是视图和一个模型。

View为FrameworkElement提供加载,失败和成功。它还给出了相应模型的参考。视图是UserControl,位于UI的某个位置。

Model是一个给出数据URI的类,一个如何解析数据的方法,以及一个文件名和如何解析文件的方法。它负责检索数据并在当前状态(加载/失败/成功)发生变化时通知View。如果从网络下载的数据与缓存不同,则网络数据优先。当应用关闭或被逻辑删除时,模型会将数据写入缓存。

听起来如何?

2 个答案:

答案 0 :(得分:4)

我花了一些时间仔细阅读您的要求,并注意到一些想法作为发声板。

首先,对于具有共同行为的重复性任务,这绝对是接近它的方法。你并不是唯一一个想到这个问题的人。

做一堆这类事情的人可能已经创建了类似的抽象,但据我所知,没有人公开发布。

如果你想要它只是为了你自己的使用和那些有非常相似要求的人,或者你是否想要处理更多的一般情况并制作一个可供广大受众使用的产品,那么你可以在多大程度上取决于它

我将假设前者,但这并不排除将其作为可以进一步开发和/或分叉的开源项目发布的可能性。

通过不尝试满足所有可能性,您可以对使用实现的性质以及特别是UI设计选择做出某些假设。

我认为你的思维方向正确。在阅读您的一些高级想法时,我认为有些事情可以简化(一件好事),同时提供一个强大的用户界面。

关于你的初步观点。

  • 你可以假设一个表现正在传递进度条。
  • 如果它对您很重要,请执行此操作,但您可能会在处理不同的缓存要求时遇到一些复杂性 - 持续时间不一致或处理不当。也许足以依靠平台内置的网址缓存(有些人发现它们会妨碍他们)。
  • 处理网络连接,是的,这是重复的,有点错综复杂。一般解决方案的完美候选者。
  • 更新用户界面......可以说更好地返回数据并将有关数据的表示和格式的决定推迟到您的个人客户。
  • 主内存中的内容 - 请参阅上面的缓存。

关于你的潜在投入。

  • 在何处显示内容 - 请参阅上述重新数据并将演示文稿选择推迟到客户端。
  • 我会使用UI元素作为进度指示器,同样是一个高性能的进度条。关于失败的沟通,我会考虑在您发布的已完成事件中实现此功能。然后通过参数,您可以传达结果并将处理推迟到客户端,以将结果放在某些表示控件/日志/任何内容中。这与.Net Framework使用的模式一致。
  • URI - 是的,这会传入。
  • 如何解析 - 传递委托以将流或字符串转换为可由客户端决定其类型的对象是有意义的。
  • 缓存的位置 - 如果概括这一点,你可以通过它,或硬编码它的路径。如果传入它会对其他人更有用(考虑一下你是否处理文件夹/创建)。

关于实施。

  • 你可以使用UserControl,如果它适合你受这个假设的约束。它会更加灵活,并且可以说同样简单/优雅,可以在客户端上将演示文稿推回到数据显示和状态消息,并控制传入的进度条的隐藏/显示。
  • 也许你会假设状态消息总是显示在一个文本块中(如果通过),并将每个客户的内务管理转移到你的通用类中。
  • 我怀疑你不会因为没有耦合数据格式和演示而受益。
  • 墓碑处理..我建议在平台上对URL进行一些测试,然后查看是否可以确定持续时间/脏条件是否适用于您的一般情况。

希望这会给你一些思考的东西,并且有些保证你会走上正确的道路。有很多方法可以解决这个问题。哪条路最终将由您的目标驱动。

答案 1 :(得分:2)

我正在开发一个WP7应用程序,它基本上是现有REST API的客户端。服务器以JSON格式返回数据。在JSON.NET库(http://json.codeplex.com/)的帮助下,我能够将它直接反序列化为我的.NET C#类。

我在本地存储数据以处理我的应用程序的离线情况,并且每次用户启动应用程序时也阻止在服务器上进行调用。我提供了两种刷新数据的方法:手动和/或一段时间后。为了存储我使用Sertling(http://sterling.codeplex.com/)的数据,它是一个简单但易于使用的Silverlight / WP7本地数据库。

最大的挑战是处理与服务器的异步通信。我提供清晰的UI反馈(Progressbar和/或加载轮),让用户了解正在发生的事情。

另一方面,我正在使用MVVM Light工具包和SL单元测试来进行集成测试View Model =>我的本地客户代码=>服务器。 (http://code.google.com/p/nunit-silverlight/wiki/NunitTestsWp7)