我经常想知道它,但现在我遇到了一个包含它的逻辑,我想我应该继续前进并获得一些解释基础知识的帮助。问题如下,我正在查看使用复合应用程序库的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中的逻辑,该逻辑将“发布”由另一个已经描述了事件处理程序逻辑的类“订阅”的事件?理解这个过程的基础布线会很棒。
由于
答案 0 :(得分:2)
第一次为每个事件调用GetEvent<T>
(由类型参数T
标识),EventAggregator
创建一个空的列表,在发布该事件时调用。通常,这会在第一次调用Publish
或Subscribe
之前发生(如示例所示)。
然后:
Subscribe
时,方法都会添加到列表中。Publish
时,它会遍历列表并进行调用。因此,在演示文稿A中调用Publish()
会导致调用Subscribe
时调用的所有方法都被调用,在您的示例中,这些方法将包括演示文稿B的OnSomeEventA
方法
尝试在OnSomeEventA
方法中设置断点并查看堆栈,不要忘记源代码也可用!