.net - Prism 事件聚合 - 未触发订阅者

标签 .net wpf prism eventaggregator

我正在使用 Prism 实现事件聚合。我有几个模块,我希望他们每个人都订阅事件,告诉他们什么时候被请求。我开始在 shell 中使用订阅和发布者做一个简单的示例。那里没有问题。现在;当我将订阅者移到我的模块时,他们不会被触发。更奇怪的是它实际上已经工作了几次——所有这些我都在断点处等待。所以在我看来这是一些比赛条件,但我不明白为什么。

假设:我不需要在任何地方设置 IEventAggregator - 例如在 IoC 容器中注册?这是内置在 Prism 中的,因此我只有一个事件聚合器实例,对吗?

所以,问题基本上是我应该如何/在哪里/何时设置我的订阅者。东西等有特定的顺序吗?在我的简化示例中,我有一个模块 MyModule。 Bootstrapper 会将 MyModule 添加到目录中 - 使其初始化:

catalog.AddModule(typeof(MyModule));

MyModule 将存储聚合器并使用它来订阅 MyModuleRequestedEvent。它还使用菜单注册表在应用程序菜单中注册。这个想法是最终点击菜单应该触发事件 - 通知 MyModule 它已被请求。然后我希望 MyModule 有责任弄清楚下一步该做什么。
public MyModule(IEventAggregator aggregator, IApplicationMenuRegistry menu)
{
    _applicationMenu = menu;
    _aggregator = aggregator;
}

public void Initialize()
{
    var evnt = _aggregator.GetEvent<MyModuleRequestedEvent>();
    evnt.Subscribe(MyModuleRequested);
    _applicationMenu.RegisterMenuItem("MyModule", evnt);
}

public void MyModuleRequested(bool b)
{
    MessageBox.Show("MyModule requested");
}

现在,我的 shell 中有一个按钮,它将发布此事件。解析时,shell 会获得相同的 (?) 事件聚合器。
public Shell(IEventAggregator aggregator)
{
    InitializeComponent();
    var evnt = aggregator.GetEvent<MyModuleRequestedEvent>();
    EventTriggerButton.Click += (s, e) => evnt.Publish(true);
}

笔记:
  • 已验证事件已发布。在 shell 中添加订阅者也会使该订阅者接收事件。
  • 再次; MyModule 中的订阅者没有被触发。然而,奇怪的是,它已经出现过几次了。
  • 我不使用事件的输入。似乎您需要一些输入类型,所以我只使用了一个虚拟 bool 值。我可以摆脱这个..?
  • 最佳答案

    Prism 事件聚合器使用弱引用链接到事件。这是为了防止事件处理程序的内存泄漏。

    一旦模块初始化程序运行,它就会被处理掉,因此您的事件处理程序在事件被触发之前被销毁。您可以通过使用订阅的重载来告诉 Prism 保留事件处理程序。

    evnt.Subscribe(MyModuleRequested, true);
    

    作为一种模式,我倾向于将任何事件订阅者放在一个单独的类中,并从模​​ block 的 Initialize 方法中调用该类。这样,当模块仍然被破坏时,事件仍然存在但分开。

    关于.net - Prism 事件聚合 - 未触发订阅者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1810730/

    相关文章:

    c# - DBReader 有行但 Read() 返回 false

    .net - 可观察集合集合已更改

    c# - 在 .NET 3.5 中使用 WCF DataContractJsonSerializer

    c# - dotMemory快照导致wpf崩溃

    c# - 在 XAML 中添加数学公式的好方法?

    c# - 增强 C# 语法糖(或绕过 "Cannot use ref or out parameter")

    wpf - 如果只有一个,则无法检索 WPF 应用程序资源

    wpf - 如何在 View 模型中使用 Mef 容器解析 View

    wpf - prism5 regionManager.RequestNavigate 显示 System.object

    c# - 多次显示同一模块