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

标签 silverlight architecture windows-phone-7

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

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

  • 显示给用户的内容可以直接取自数据源,例如 ObservableCollection ,或者它可能是对数据源的查询。

    我想将这个重复的过程分解到一个框架中,理想情况下只需要指定以下内容:
  • 在 UI 中的何处显示内容
  • 在加载、失败和成功时显示的 UI 元素
  • HTTP 请求的 URI
  • 如何将 HTTP 响应解析为将保存在内存中的数据结构
  • 文件在隔离存储中的位置(如果存在)
  • 如何将文件内容解析成将保存在内存中的数据结构

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

    此外,这需要适用于数据在内存中维护的情况,并且需要适用于直接集合和对这些集合的查询。

    我的问题是:

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

    我对上述主题的想法在某些方面根本上是错误的吗?

    这是我正在考虑的设计:

    有两个组件,一个 View 和一个模型。

    View 被赋予 FrameworkElement s 表示加载、失败和成功。它还提供了对相应模型的引用。 View 是 UserControl放置在 UI 中的某个位置。

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

    听上去怎么样?

    最佳答案

    我花了一些时间仔细阅读了您的要求,并指出了一些想法作为引用。

    首先,对于具有共同行为的重复任务,这绝对是处理它的方法。考虑这个问题的不止您一个人。

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

    你能走多远可能取决于你是否打算将它只供你自己使用和那些有非常相似要求的人使用,或者你是否想要处理更一般的情况并制作一个可供非常广泛的受众使用的产品。

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

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

    我认为总体上你的想法是正确的。在阅读您的一些高级想法时,我认为可以简化一些事情(一件好事),同时提供引人注目的 UI。

    关于你的初始点。

  • 您可以假设正在传入性能不确定的进度条。
  • 如果这对您很重要,请执行此操作,但您可能会在处理不同的缓存要求时让自己陷入一些复杂性 - 持续时间差异或脏处理。也许足以依靠平台内置的 url 缓存(有些人发现这会妨碍他们)。
  • 处理网络连接,是的,这是重复且有些复杂的。通用解决方案的完美候选者。
  • 更新用户界面...可以说,最好只返回数据并将有关数据呈现和格式的决定推迟到您的个人客户。
  • 主内存中的内容 - 请参阅上文有关缓存的内容。

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

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

  • 希望这能让你思考一些事情,并让你确信你正朝着正确的道路前进。有很多方法可以解决这个问题。哪条最佳路径最终将由您的目标驱动。

    关于silverlight - 数据驱动 Silverlight WP7 应用程序的架构设计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4560037/

    相关文章:

    silverlight - 像 Silverlight 数据网格中的 FILTER 功能一样的 Excel?

    wpf - 向 RenderTargetBitmap 添加可选硬件加速

    node.js - Grails 作为单个应用程序或不同的后端和前端应用程序

    MySQL数据库设计-存储图像-单表或多表

    c# - 使用 SQLite 在 Windows Phone 商店上上传什么 appx ( x86/ARM )

    c# - 我如何在 SilverLight 中组合一些用户控件?

    Silverlight 将 DataContext 传递给 ConverterParameter?

    c++ - 多平台类设计 C++

    c# - 我如何在 wp7 上的 XNA 中创建点击手势之间的延迟

    c# - 电话 7 : how does it execute code?