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

UWP MVVM Template10: Access single instance of external API across application

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

既然我需要在任何地方访问 API 的单个实例,我该如何正确地做到这一点?我使用过 MVVM,但从未使用过 Template10,并且之前从未在整个 MVVM UWP 应用程序中共享对象的实例。

目前我能想到三种方法:

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

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

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

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

最佳解决方案包含 singleton service and inversion of control (IoC) / Dependency injection。这是一个非常复杂的话题,所以我绝对鼓励从多个来源阅读它。

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

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

对于通用解决方案,请查看此 ,它演示了在 UWP 中使用 AutoFac。

您还可以在 this SO question and this one 中看到一些专门针对模板 10 的代码示例。

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