C# 在MVVM应用程序中不建议使用MessageBox?

C# 在MVVM应用程序中不建议使用MessageBox?,c#,mvvm,dialog,C#,Mvvm,Dialog,当我问到如何在MVVM中实现对话框时,有人建议我阅读以下内容: 在视图模型中,对话框的调用方式如下: var dialog = new DialogViewmodel(); var result = _dialogservice.ShowDialog("My Dialog", dialog); if(result.HasValue && result.Value) { //accept true } else { //Cancel or false } 但这与

当我问到如何在MVVM中实现对话框时,有人建议我阅读以下内容:

在视图模型中,对话框的调用方式如下:

var dialog = new DialogViewmodel();
var result = _dialogservice.ShowDialog("My Dialog", dialog);

if(result.HasValue && result.Value)
{
    //accept true
}
else
{
    //Cancel or false
}
但这与以这种方式使用messageBox不同吗

DialogResult result = MessageBox.Show("Hello");

if(result == DialgoResult-OK)
{
    //accept true
}
else
{
    //Cancel or false
}
在第二种情况下,我使用MessageBox而不是自定义对话框,所以我看不到任何区别


无论如何,在很多情况下,我读到在MVVM应用程序中使用MessageBox是一个坏主意,因为它破坏了MVVM模式。但是如果这是真的,我不知道第一个解决方案如何不打破MVVM模式,第二个解决方案如何打破MVVM模式。

MVVM模式的基本思想是分离关注点。视图模型不应该知道如何处理或显示对话框。为什么?以下是一些原因:

测试视图模型:不需要任何对话框—假设您需要一直单击对话框 创建GUI应用程序的控制台应用程序对话框应显示在控制台中,而不是弹出框 如果需要更改所有MessageBox调用,则需要更改对话框的设计 ... 解决方案: 通过为对话框实现定义良好的接口来使用依赖项注入。您可以在中找到一个非常好的基本示例

结果:
调用_dialogservice.ShowDialog可能只是MessageBox.Show的包装,但也可能是测试期间控制台应用程序或调试日志中控制台中的某个对话框。因此,代码与任何表示都很好地分离。

MVVM模式的基本思想是分离关注点。视图模型不应该知道如何处理或显示对话框。为什么?以下是一些原因:

测试视图模型:不需要任何对话框—假设您需要一直单击对话框 创建GUI应用程序的控制台应用程序对话框应显示在控制台中,而不是弹出框 如果需要更改所有MessageBox调用,则需要更改对话框的设计 ... 解决方案: 通过为对话框实现定义良好的接口来使用依赖项注入。您可以在中找到一个非常好的基本示例

结果:
调用_dialogservice.ShowDialog可能只是MessageBox.Show的包装,但也可能是测试期间控制台应用程序或调试日志中控制台中的某个对话框。因此,代码与任何表示都很好地分开。

每个messagebox都是U/X设计错误,因为它会中断用户。但是在MVVM和软件架构上下文中,请尝试从依赖性和可测试性的角度来看待它。直接调用MessagBox的虚拟机更难测试。为什么不创建一个IAlertService来处理MessageBox,就像处理对话框一样?这是否回答了您的问题?每个messagebox都是一个U/X设计错误,因为它会中断用户。但是在MVVM和软件架构上下文中,试着从依赖性和可测试性的角度来看待它。直接调用MessagBox的虚拟机更难测试。为什么不创建一个IAlertService来处理MessageBox,就像处理对话框一样?这是否回答了您的问题?OP只需要根据其对话服务使用与IAlertService等价的服务。无论它是由DI提供的,都不在这里,也不在那里。根据对话服务,OP只需要与IAlertService等价的服务。它是否由DI提供,这一点也不清楚