14

我通过 Prism 指导工作,并认为我掌握了他们的大多数通信工具。

命令非常简单,因此很明显,DelegateCommand 将仅用于将 View 与其 Model 连接起来。

当涉及到跨模块通信时,特别是何时使用 EventAggregation 而不是复合命令时,这有点不太清楚。

实际效果是一样的,例如

  • 您发布一个事件 -> 所有订阅者都会收到通知并执行代码作为响应
  • 您执行一个复合命令->所有已注册的命令都被执行并附带它们的代码

两者都按照“触发并忘记”的方式工作,即他们不关心触发事件/执行命令后订阅者的任何响应。

尽管我知道两者的实现(在引擎盖下)非常不同,但我很难看到使用上的实际差异。

那么我们是否应该考虑一下它的实际含义——事件?那是当事情发生(事件发生)时吗?用户没有直接请求的东西,比如“网络请求已完成”?

指挥部呢?这是否意味着用户点击了某些东西,从而向我们的应用程序发出命令,直接请求服务?

是这样吗?或者是否有其他方法可以确定何时使用其中一种通信工具而不是另一种。该指南虽然是我读过的最好的文档之一,但没有给出具体解释。

所以我希望参与/使用 Prism 的人可以帮助阐明这一点。

4

2 回答 2

16

这两者之间有两个主要区别。

  1. 可以执行命令。Command 可以通过调用 Command.RaiseCanExecuteChanged() 并让其 CanExecute 委托返回 false 来判断它是否可以执行。如果您考虑“全部保存”CompositeCommand 组合多个“保存”命令的情况,但其中一个命令说它无法执行,则“全部保存”按钮将自动禁用(很好!)。
  2. EventAggregator 是一种消息模式,而命令是一种命令模式。尽管 CompositeCommands 不是明确的 UI 模式,但它是隐含的(通常它们与输入操作挂钩,例如按钮单击)。EventAggregator 不是这种方式——应用程序的任何部分都有效地引发 EventAggregator 事件:后台进程、ViewModel 等。它是跨应用程序消息传递的中介途径,支持过滤、后台线程执行等。

希望这有助于解释差异。很难说何时使用每个,但通常我使用经验法则,如果是引发事件的用户交互,则对其他任何事情使用命令,使用 EventAggregator

希望这可以帮助。

于 2009-10-05T17:47:36.047 回答
7

此外,还有一个更重要的区别:在当前实现中,来自 EventAggregator 的事件是异步的,而 CompositeCommand 是同步的。

如果你想实现类似“通知事件 X 发生;做一些依赖于事件 X 已执行的事件处理程序的事情”,你要么必须做类似 Application.DoEvents() 的事情,要么使用 CompositeCommands。

于 2010-09-06T06:56:41.657 回答