7

我正在编写一个侦听网络连接的应用程序,当一些数据到达时,它会回复,并且根据传入的数据,它可能需要在回复之前询问用户(显示对话框)。

我不知道如何在 MV-VM 架构中干净地做到这一点:如果我只需要根据传入的数据更新 GUI,那么事件和绑定到可观察集合很好,但是如果我在回复之前确实需要用户的回答怎么办?

更糟糕的是,我想同步进行,因为我希望我的回复算法在一个地方,而不是划分为多个回调,并不清楚“谁打电话给谁”的责任。

简单地说,像

HandleMessage(Message msg){
    string reply;
    if (msg.type == 1) {
        reply = ...
    } else {
        string question = msg...
        reply = ShowModalDialog(question); // MVVM violation!
    }
    sender.Send(reply);
}

但我不想从模型中调用视图或视图模型,因为模型需要可重用和可测试 - 我不想在每次测试运行时弹出对话框,这将违反 MVVM!没有事件(据我所知,它们只是单向的,并且没有反向通道来获取对事件来源的回复)或数据绑定,因为它是异步的。

这是可行的吗?这是我问了几个测试驱动开发传播者的问题,到目前为止,我还没有得到实际可用的答案。然而,在处理过程中需要一些额外的输入是相当普遍的。

谢谢!

编辑:这是应用程序逻辑,所以它显然属于模型,即使在这种情况下它不属于,我想知道在模型中的业务逻辑例程中间确实需要用户输入的情况下的解决方案.

4

3 回答 3

4

这是 MVVM 无法自行解决的问题之一。一种解决方案是使用服务来查询用户,然后让 ViewModel 使用该服务。

在我的项目中,我们使用PRISM,它除了提供服务框架外,还提供了其他工具来简化 GUI 开发。

是关于服务如何在 PRISM 中工作的文章。

因此,特别是在您的情况下,我将创建某种 IOC,向其注册查询服务,然后在 ViewModel 中传入 IOC,然后使用 IOC 获取查询服务,并使用它来查询用户。更多的工作?当然。但这意味着您可以通过在 IOC 中简单地替换查询服务来使用另一个实现进行测试。

MVVM + 服务 = 终极力量!

于 2009-05-19T23:48:46.443 回答
1

我不知道这个想法是否严格遵守 MVVM 的原则,但是......我会将对话功能封装为服务(通过接口引用)。服务的实现将在 UI 层中,但出于测试目的,您只需“模拟”界面即可。

于 2009-05-19T22:34:33.583 回答
0

实际上,它并不都属于应用程序逻辑。

似乎您有两种不同的“观点”。有第一个(通过网络传入的数据)和第二个(确认对话框)。

模型需要确定需要显示一个新视图,向视图发出信号以显示它,然后响应来自该视图的输入。

不要试图一步完成。

于 2009-05-19T20:51:00.483 回答