2009-02-17 34 views
10

我一直在寻找到Composite Application Library,这很好,但是我在决定何时使用EventAggregator ......或者更确切地说 - 无法使用它的时候遇到了麻烦。CompositeWPF:EventAggregator - 何时使用?

看着StockTraderRI的例子,我更加困惑。他们在某些情况下使用EventAggregator,在其他情况下使用“经典”事件(例如在IAccountPositionService接口中)。

我已经决定将它用于与繁重的工作任务进行通信,该任务应该在后台线程上运行。在这种情况下,EventAggregator提供幕后线程的编组,所以我不必担心这一点。除此之外,我喜欢这种方法提供的解耦。

所以我的问题是:当我开始在我的应用程序中使用EventAggregator时,为什么不使用它为所有自定义事件?

回答

20

这是一个很好的问题。在Composite WPF(Prism)中,有3种可能的方式在应用程序的各个部分之间进行通信。一种方法是使用指令,它仅用于将UI触发的操作传递给实现该操作的实际代码。另一种方法是使用共享服务,其中多个部分持有对同一服务(单例)的引用,并以传统方式处理该服务上的各种事件。对于断开和异步通信,正如您已经说过的,最好的方法是使用Event Aggregator(紧跟Martin Fowler的模式)。

现在,当不使用它:

  1. 使用它时,你需要的模块之间的通信。 (例如,任务由其他模块创建时,需要通知任务模块)。
  2. 当您有多个可能的接收者或同一事件的来源时使用它。例如,您有一个对象列表,并且每当保存或创建该类型的对象时都要刷新它。您不必保留对所有打开的编辑/创建屏幕的引用,而只需订阅此特定事件。
  3. 当您只需订购模型视图展示器区域中的正常事件时,请勿使用它。例如,如果您的演示者监听模型中的更改(例如Model实现INotifyPropertyChanged),并且Presenter需要对这些更改作出反应,则最好由Presenter直接处理Model的PropertyChanged事件,而不是通过事件聚合器。因此,如果发送者和接收者都在同一个单元中,则不需要将这些事件“广播”给整个应用程序。

我希望这能回答你的问题。

+0

#3确实是我最怀疑的地方,但我可以看到没有将事件广播给整个应用程序的观点是有道理的。感谢您的回答 :-) – toxvaerd 2009-02-18 07:35:42