Windows 8 引入了许多新功能,开发人员可利用这些功能创建引人注目的应用程 序和形式丰富的 UX。遗憾的是,这些功能并非总是易于进行单元测试。共享和辅助磁贴等功 能可提高应用程序的互动性和趣味,但也会变得不太易于测试。
在本文中,我将介绍 让应用程序可使用共享、设置、辅助磁贴、应用程序设置和应用程序存储等功能的多种不同 方式。通过使用模型-视图-视图模型 (MVVM) 模式、依赖注入和某些抽象,我将向您演示如 何利用这些功能,同时将表示层保持易于进行单元测试。
关于示例应用程序
为了说明将在本文中谈论的概念,我已使用 MVVM 编写了一个示例 Windows 应用商 店应用程序,用户使用它可通过其喜爱的博客的 RSS 源查看博客文章。该应用程序说明了如 何:
通过“共享”超级按钮与其他应用程序共享有关某篇博客文章的信息
用“设置”超级按钮更改用户要阅读的博客
用辅助磁贴将喜爱的博客文章固定到“开始”屏幕供以后阅读
保存喜爱的博客以供在所有具有漫游设置的设备上查看
除了该示例应用程序,我还使用了将在本文中谈论的特定 Windows 8 功能,并将其抽象 化为一个名为 Charmed 的开源库。Charmed 可用作帮助程序库或仅用作参考。Charmed 的目 标是成为一个适用于 Windows 8 和 Windows Phone 8 的跨平台 MVVM 支持库。我将在以后 的文章中详细谈论该库的 Windows Phone 8 一面。可在 bit.ly/17AzFxW 了解 Charmed 库的进展。
我 对于本文和示例代码的目标是演示我使用 Windows 8 提供的某些新功能开发采用 MVVM 模式 的可测试应用程序的方法。
MVVM 概述
在深入探讨代码和特定 Windows 8 功能之前,我将简要介绍一下 MVVM。MVVM 是近年来在基于 XAML 的技术方面广受青睐的一 种设计模式,这些技术包括 Windows Presentation Foundation (WPF)、Silverlight、 Windows Phone 7、Windows Phone 8 和 Windows 8(Windows Runtime,简称 WinRT)。 MVVM 将应用程序的体系结构划分为三个逻辑层: 模型、视图模型和视图,如图 1 所示。
图 1:模型-视图- 视图模型的三个逻辑层
模型层涉及应用程序的业务逻辑,即业务对象、数据验证、数 据访问等。实际上,模型层通常分为更多层,甚至可能分为多个层级。如图 1 所示,模型层 是应用程序在逻辑意义上的底部,或称基础。
视图模型层容纳应用程序的表示逻辑, 其中包括要显示的数据、帮助启用 UI 元素或使其可见的属性以及将同时与模型层和视图层 进行交互的方法。基本上,视图模型层是对于 UI 当前状态的一种与视图无关的表示形式。 我说“与视图无关”是因为它仅仅为要与之交互的视图提供数据和方法,而不指示该视图将 如何表示数据,也不允许用户与这些方法进行交互。如图 1 所示,视图模型层在逻辑上位于 模型层与视图层之间,并可与后两者交互。视图模型层包含以前将位于视图层的隐藏代码中 的代码。
视图层包含应用程序的实际表示形式。对于基于 XAML 的应用程序,如 Windows Runtime 应用程序,视图层主要(如果不是全部)由 XAML 构成。视图层利用强大 的 XAML 数据绑定引擎绑定到视图模型上的属性,同时将某种外观应用于在其他情况下没有 可视化表示形式的数据。如图 1 所示,视图层是应用程序在逻辑意义上的顶部。视图层直接 与视图模型层交互,但对模型层一无所知。
MVVM 模式的主要用途是将应用程序的表 示形式与其功能相分离。这样做使应用程序对于单元测试更加有益,因为功能现在位于普通 旧 CLR 对象 (POCO) 中,而非自行决定生命周期的视图中。
合约
Windows 8 引入了合约的概念,即两个或更多应用程序对于用户系统达成的协议。这些合约使所有应 用程序保持一致,并使开发人员可从任何支持功能的应用程序中利用这些功能。应用程序可 在 Package.appxmanifest 文件中声明其支持的合约,如图 2 所示。
图 2: Package.appxmanifest 文件中的合约