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

时间:2018-09-12 02:13:34

标签: c# mvvm uwp template10 uwp-navigation

我的任务是通过模板10接管使用MVVM进行部分开发的大型且复杂的UWP应用程序。该应用程序需要使用内部开发的webservices 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,然后在ViewModels之间将其作为参数传递,大概使用导航服务。

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

编辑:对不起,代码未格式化,编辑框将其格式化,但是保存时,它又回到了一个很长的句子:-(

1 个答案:

答案 0 :(得分: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中看到一些专门针对模板10的代码示例。

此解决方案比使用static和全局实例更好,因为您实际上从未处理过任何硬编码的引用,并且实际上始终仅针对接口工作。您将接口作为构造函数的参数,而IoC将负责为您提供实例。另外,您可以随时将接口实现换成其他类,而只需要在一个位置(即IoC注册)进行更新即可。