【问题标题】:Event Aggregation...What exactly is going on?事件聚合...到底发生了什么?
【发布时间】:2009-11-19 19:55:21
【问题描述】:

我经常对此感到疑惑,但现在我遇到了一个包含它的逻辑,我想我应该继续寻求一些帮助来破译基本原理。问题如下,我正在查看一个使用复合应用程序库的 WPF 应用程序。在应用程序的源代码中,我在视图的演示文稿中遇到了以下代码行。为了方便起见,我将其称为 Presentation 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 中的逻辑,该逻辑将“发布”一个由另一个类“订阅”的事件,其中描述了事件处理程序的逻辑?了解这个过程的底层布线会很棒。

谢谢

【问题讨论】:

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


    【解决方案1】:

    第一次为每个事件调用GetEvent&lt;T&gt;(由类型参数T 标识)时,EventAggregator 创建一个空的方法列表,以便在该事件发布时调用。通常,这将在第一次调用 PublishSubscribe 之前立即发生(如您的示例中所示)。

    然后:

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

    因此,在 Presentation A 中调用 Publish() 会导致调用 Subscribe 注册的所有方法,在您的示例中,这将包括 Presentation B 的 OnSomeEventA 方法。

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

    【讨论】:

    • 感谢 GraemeF。我了解事件聚合器正在维护调用发布时要调用的方法列表。但是我仍然对订阅部分感到有些困惑。订阅是在运行时还是在初始编译过程中完成的?
    • 一切都发生在运行时。我在回答中添加了更多细节 - 希望对您有所帮助!
    • 非常有意义。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-29
    相关资源
    最近更新 更多