我的任务是通过模板10使用MVVM接管部分开发的大型和复杂的UWP应用程序。该应用程序需要使用内部开发的Web服务API,这需要用于几乎所有单个功能,从初始开始登录页面。
因此,我需要在任何地方访问API的单个实例,我该如何正确地执行此操作?我已经使用了MVVM但从未使用过Template10,并且之前从未在整个MVVM UWP应用程序中共享对象的实例。
到目前为止,我可以想到三种方式:
c#
public class Globals
{
private static OurAPI _ourAPI;
public static OurAPI API
{
get { return _ourAPI; }
set { _ourAPI = value; }
}
}
我认为1或2很可能不符合MVVM并且可能导致单元测试问题所以3可能是最好的选择吗?或者是否有另一种更正确的方法来遵守Template10 / MVVM概念并且能够对其进行单元测试?
编辑:抱歉代码没有格式化,编辑框格式化它确定但是当我保存它它回到一个长句:-(
最好的解决方案包括singleton服务和inversion of control (IoC) / Dependency injection。这是一个非常复杂的主题,所以我绝对鼓励从几个来源阅读它。
总之,您首先要为您的服务创建一个接口,您可以在其中声明所有公共成员和方法。然后,您创建一个接口的实现。然后使用IoC容器并将服务注册为单例(单实例),然后集成IoC,以便创建视图模型的实例。然后,您可以将接口作为视图模型的构造函数参数,IoC容器将确保提供您注册的单例实例。
在您的情况下,您正在使用模板10,它可以与不同的IoC容器集成,如in the documentation所示。查看AutoFac作为IoC容器的示例。您可以在文档中看到一些注册和解析服务的示例。
对于一般解决方案,请检查此SO question,它演示了如何在UWP中使用AutoFac。
您还可以在this SO question和this one中专门为Template 10查看一些代码示例。
这个解决方案比使用static
和全局实例更好,因为你从来没有真正处理任何硬编码的引用,实际上总是只对接口工作。您将接口作为构造函数的参数,IoC将负责为您提供实例。此外 - 您可以随时将接口实现交换为其他类,您只需在一个位置更新它 - IoC注册。