【发布时间】:2010-12-21 02:38:51
【问题描述】:
我正在使用 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 中的订阅者没有被触发。然而,奇怪的是,它已经出现过几次了。
- 我不使用事件的输入。似乎您需要一些输入类型,所以我只使用了一个虚拟布尔值。我可以摆脱这个..?
【问题讨论】:
-
听起来你确实得到了两个 EventAggregator;使用调试器为它们创建一个对象 ID,以便您检查并告知我们。
-
感谢您的提示!做到了,它实际上是用于在模块中订阅和发布的同一个 EventAggregator。首先进入 Shell 构造函数。做了“制作对象ID”。得到1#。然后在 MyModule.Initialize 中打断点,并验证那里的聚合器的 ID 为 1#。此外,当点击按钮触发发布时,我看到使用的聚合器是 1#。
标签: .net wpf prism eventaggregator