UWP MVVM 模板 10:跨应用程序访问外部 API 的单个实例



我的任务是通过模板 10 使用 MVVM 接管一个部分开发的大型复杂 UWP 应用程序。 该应用程序需要使用内部开发的Web服务API,并且几乎需要将其用于每个功能,从初始登录页面开始。

因此,鉴于我需要在任何地方访问 API 的单个实例,我该如何正确执行此操作? 我使用过 MVVM 很多,但从未使用 Template10,以前也从未在整个 MVVM UWP 应用中共享对象的实例。

到目前为止,我能想到三种方法:

  1. 在 Appl.xaml 中声明和实例化 API 实例.cs并全局使用它
  2. 创建一个公共 Globals 类,并将该实例作为公共静态属性:c# public class Globals { private static OurAPI _ourAPI; public static OurAPI API { get { return _ourAPI; } set { _ourAPI = value; } } }

  3. 在登录页面中实例化 API,然后将其作为参数在 ViewModel 之间传递,大概使用导航服务。

我认为 1 或 2 很可能不符合 MVVM 标准,可能会导致单元测试问题,所以也许 3 是最佳选择?或者有没有另一种更正确的方法来做到这一点,以遵循 Template10/MVVM 概念并能够对其进行单元测试?

编辑:很抱歉代码没有格式化,编辑框格式化它好的,但是当我保存它时,它会回到一个长句子:-(

最好的解决方案包括单例服务和控制反转 (IoC(/依赖注入。这是一个相当复杂的话题,所以我绝对鼓励从几个来源阅读它。

总之,首先为服务创建一个接口,在其中声明所有公共成员和方法。然后创建接口的实现。然后,使用 IoC 容器并将服务注册为单一实例(单实例(,然后集成 IoC,以便它创建视图模型的实例。然后,您可以将接口作为视图模型的构造函数参数,IoC 容器将确保提供您注册的单一实例。

在您的情况下,您使用的是模板 10,它可以与不同的 IoC 容器集成,如文档所示。查看 AutoFac 作为 IoC 容器的示例。您可以在文档中看到一些注册和解析服务的示例。

有关常规解决方案,请查看此 SO 问题,该问题演示了如何在 UWP 中使用 AutoFac。

您还可以在此 SO 问题中看到一些代码示例,以及专门针对模板 10 的此问题。

此解决方案比使用static和全局实例更好,因为您从未实际处理过任何硬编码引用,实际上总是只针对接口工作。将接口作为构造函数的参数,IoC 将负责为您提供实例。此外 - 您可以随时将接口实现交换为不同的类,您只需在一个位置更新它 - IoC 注册。

最新更新