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

问题描述 投票:3回答:1

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

因此,我需要在任何地方访问API的单个实例,我该如何正确地执行此操作?我已经使用了MVVM但从未使用过Template10,并且之前从未在整个MVVM UWP应用程序中共享对象的实例。

到目前为止,我可以想到三种方式:

  1. 在Appl.xaml.cs中声明并实例化API实例并在全局范围内使用它
  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概念并且能够对其进行单元测试?

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

c# mvvm uwp template10 uwp-navigation
1个回答
3
投票

最好的解决方案包括singleton服务和inversion of control (IoC) / Dependency injection。这是一个非常复杂的主题,所以我绝对鼓励从几个来源阅读它。

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

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

对于一般解决方案,请检查此SO question,它演示了如何在UWP中使用AutoFac。

您还可以在this SO questionthis one中专门为Template 10查看一些代码示例。

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

© www.soinside.com 2019 - 2024. All rights reserved.