试图了解使用服务打开对话框

我已经阅读了有关使用mvvm模式打开对话框的讨论。 我已经看过几个说使用服务的例子,但我不理解所有部分是如何组合在一起的。 我正在发布这个问题,要求我在阅读内容时提供指导,以便更好地理解我所缺少的内容。 我将发布下面的内容,它确实有效,但是从我在这些post中看到的内容来看,我做得不对,或者说效率不高。 我看到创建对话框界面的位置,然后是使用该界面进行实际工作的类。 然后在ViewModel中一个构造函数传递到这个界面,这是真正让我感到困惑的部分,不知道是什么传递它,没有足够的信息来连接点而不确定我缺少什么。

这是我看过的一篇文章: https : //stackoverflow.com/a/1044304/4593652我有点看到他们的建议,但这对于有人学习的信息来说还不够。 我不是要求任何人为我写这个,只是希望对我应该阅读的内容有所了解,以了解这些部分是如何组合在一起的。

在我的代码中,我有一个这样的类:(这有效,我只是觉得我错过了我在其他post上阅读的内容)

public class OpenDialogService { public string GetOpenDialog(string title) { CommonOpenFileDialog dlg = new CommonOpenFileDialog(); dlg.Title = title; dlg.IsFolderPicker = true; dlg.AddToMostRecentlyUsedList = true; dlg.AllowNonFileSystemItems = false; dlg.EnsureFileExists = false; dlg.EnsurePathExists = true; dlg.EnsureReadOnly = false; dlg.EnsureValidNames = true; dlg.Multiselect = false; dlg.ShowPlacesList = true; if (dlg.ShowDialog() == CommonFileDialogResult.Ok) { return dlg.FileName; } return null; } } 

然后我在调用我的命令时在我的ViewModel中使用它。

 path = new OpenDialogService().GetOpenDialog("..."); 

瓦尔特基本上是正确的。

另一篇文章说他可以通过IOC Container改变他的服务实现。 IOC表示“控制反转”-Pattern,您可以阅读本文以获得基本概述。 我认为“服务”也来自该模式。 另一个流行语是你可以寻找的dependency injection。

好的,这里有几个问题。

正如@ ec8or指出的那样,您应该阅读“控制反转”(IoC),因为几乎所有MVVM框架都使用它。 服务模式也依赖于IoC,因此测试更容易。

代码中缺少的位是服务的接口,并使用IoC将代码注入ViewModel。

 public interface IOpenDialogService { string GetOpenDialog(string title); } public class OpenDialogService : IOpenDialogService ... 

然后在ViewModel中使用它

 public class MyViewModel { private IOpenDialogService openDialogService; // service injected by the IoC public MyViewModel(IOpenDialogService openDialogService) { this.openDialogService = openDialogService; } public void DoCommand() { var path = openDialogService.GetOpenDialog("..."); } } 

那么为什么呢?

当您测试ViewModel时,您不希望突然弹出对话框,导致测试失败或挂起。 因此,在测试期间,我们可以将IOpenDialogService的实现更改为返回常量的内容,例如。 然后,当您测试ViewModel而不是打开对话框时,代码将获得常量并继续运行,从而允许测试完成。

这样,您无需修改​​ViewModel代码,只是为了在测试期间使其工作。