Prism NotificationRequest 与 Xceed MessageBox
Prism NotificationRequest vs Xceed MessageBox
当我们使用 MVVM 时,我们被告知要避免在我们的 ViewModel 中使用 System.Windows.MessageBox,我想这是因为它不利于我们的测试。是真的吗?
使用 Prism NotificationRequest,我们可以与用户进行交流,但它比简单的 MessageBox 稍微复杂一些。
另一种方法是使用 Xceed Wpf Toolkit MessageBox,它比 Prism NotificationRequest 更简单。
我的问题是:它们是等价的吗?我们可以以 MVVM 的方式使用它们中的任何一个吗?如果NO,什么时候需要使用NotificationRequest,什么时候可以使用Xceed MessageBox?
谢谢
如果您从可以在测试时用模拟替换的服务调用 MessageBox.Show()
,就没问题。
毕竟,您不希望在 运行 您的视图模型单元测试时弹出消息框...
示例:
public interface IMessageBoxService
{
ClickedButten ShowMessageBox( string message, Buttons buttons );
}
internal class SomeViewModel
{
public SomeViewModel( IMessageBoxService messageBoxService )
{
_messageBoxService = messageBoxService;
}
public void SomeMethodThatNeedsAMessageBox()
{
var theClickedButton = _messageBoxService.ShowMessageBox( "Click me!", Buttons.Ok | Buttons.Cancel );
// react to the click...
}
}
internal class SystemMessageBoxService : IMessageBoxService
{
public ClickedButten ShowMessageBox( string message, Buttons buttons )
{
// adapt parameters...
MessageBox.Show(...);
// adapt result...
}
}
internal class XceedMessageBoxService : IMessageBoxService
{
public ClickedButten ShowMessageBox( string message, Buttons buttons )
{
// adapt parameters...
Xceed.ShowMessageBox(...);
// adapt result...
}
}
现在只需绑定您要使用的服务(甚至可以在运行时决定),并在测试时注入模拟。
当我们使用 MVVM 时,我们被告知要避免在我们的 ViewModel 中使用 System.Windows.MessageBox,我想这是因为它不利于我们的测试。是真的吗?
使用 Prism NotificationRequest,我们可以与用户进行交流,但它比简单的 MessageBox 稍微复杂一些。
另一种方法是使用 Xceed Wpf Toolkit MessageBox,它比 Prism NotificationRequest 更简单。
我的问题是:它们是等价的吗?我们可以以 MVVM 的方式使用它们中的任何一个吗?如果NO,什么时候需要使用NotificationRequest,什么时候可以使用Xceed MessageBox?
谢谢
如果您从可以在测试时用模拟替换的服务调用 MessageBox.Show()
,就没问题。
毕竟,您不希望在 运行 您的视图模型单元测试时弹出消息框...
示例:
public interface IMessageBoxService
{
ClickedButten ShowMessageBox( string message, Buttons buttons );
}
internal class SomeViewModel
{
public SomeViewModel( IMessageBoxService messageBoxService )
{
_messageBoxService = messageBoxService;
}
public void SomeMethodThatNeedsAMessageBox()
{
var theClickedButton = _messageBoxService.ShowMessageBox( "Click me!", Buttons.Ok | Buttons.Cancel );
// react to the click...
}
}
internal class SystemMessageBoxService : IMessageBoxService
{
public ClickedButten ShowMessageBox( string message, Buttons buttons )
{
// adapt parameters...
MessageBox.Show(...);
// adapt result...
}
}
internal class XceedMessageBoxService : IMessageBoxService
{
public ClickedButten ShowMessageBox( string message, Buttons buttons )
{
// adapt parameters...
Xceed.ShowMessageBox(...);
// adapt result...
}
}
现在只需绑定您要使用的服务(甚至可以在运行时决定),并在测试时注入模拟。