2

我经常想知道它,但现在我遇到了一个包含它的逻辑,我想我应该继续在破译基本面方面获得一些帮助。问题如下,我正在查看一个使用复合应用程序库的 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 中的逻辑,该逻辑将“发布”一个由另一个类“订阅”的事件,其中描述了事件处理程序的逻辑?了解这个过程的基本布线会很棒。

谢谢

4

1 回答 1

2

第一次GetEvent<T>为每个事件调用(由 type 参数标识TEventAggregator创建一个空的方法列表,以便在该事件发布时调用。通常,这将在第一次调用Publishor之前立即发生Subscribe(如您的示例中所示)。

然后:

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

因此,Publish()在演示文稿 A 中的调用会导致所有已通过调用注册的方法Subscribe被调用,在您的示例中将包括演示文稿 B 的OnSomeEventA方法。

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

于 2009-11-19T20:07:18.897 回答