事件聚合......究竟发生了什么?

时间:2009-11-19 19:55:21

标签: wpf events unity-container prism publish-subscribe

我经常想知道它,但现在我遇到了一个包含它的逻辑,我想我应该继续前进并获得一些解释基础知识的帮助。问题如下,我正在查看使用复合应用程序库的WPF应用程序。在应用程序的源代码中,我在视图的演示文稿中遇到了以下代码行。为了方便起见,我将其称为演示文稿A:

private void OnSomethingChanged(SomeArgumentType arguement)
{
   UnityImplementation.EventAggregator.GetEvent<EventA>().Publish(null);
}

当我在上面给出的方法中看到方法Publish时,我的直觉告诉我必须有一个订阅地点和另一个类,我会称之为Presentation B,其中有以下内容:

UnityImplementation.EventAggregator.GetEvent(Of EventA).Subscribe(AddressOf OnSomeEventA)

在同一个类中有一个名为OnSomeEventA的私有函数,其中包含一些逻辑。

我的问题是,这里的一切都是如何连线的?这里的'发布''订阅'究竟取得了什么成果?当'某些东西'改变时,编译器如何知道它必须遵循OnSomethingChanged中的逻辑,该逻辑将“发布”由另一个已经描述了事件处理程序逻辑的类“订阅”的事件?理解这个过程的基础布线会很棒。

由于

1 个答案:

答案 0 :(得分:2)

第一次为每个事件调用GetEvent<T>(由类型参数T标识),EventAggregator创建一个空的列表,在发布该事件时调用。通常,这会在第一次调用PublishSubscribe之前发生(如示例所示)。

然后:

  • 每当调用Subscribe时,方法都会添加到列表中。
  • 每当调用Publish时,它会遍历列表并进行调用。

因此,在演示文稿A中调用Publish()会导致调用Subscribe时调用的所有方法都被调用,在您的示例中,这些方法将包括演示文稿B的OnSomeEventA方法

尝试在OnSomeEventA方法中设置断点并查看堆栈,不要忘记源代码也可用!

相关问题