3

我正在构建一个 Prism 2.1 演示以跟上该技术的速度。我遇到了通过事件聚合服务发布和订阅的 CompositePresentationEvents 的问题。如果我设置一个强引用(KeepSubscriberReferenceAlive = true),事件订阅工作正常,但如果我设置一个弱引用(KeepSubscriberReferenceAlive 省略),它会失败。

我想订阅一个弱引用,这样我就不必管理取消订阅事件。有没有办法做到这一点?为什么这里需要强引用?谢谢你的帮助!

以下是详细信息:我的演示应用程序是单线程的,有两个区域,Navigator 和 Workspace,以及三个模块,NavigatorModule、WorkspaceAModule 和 WorkspaceBModule。NavigatorModule 有两个按钮,“显示工作区 A”和“显示工作区 B”。单击其中一个按钮时,将调用一个发布名为 ViewRequested 的 CompositePresentationEvent 的 ICommand。该事件携带一个字符串有效负载,指定应显示哪个工作区模块。

以下是来自应用的基础设施项目的事件声明:

using Microsoft.Practices.Composite.Presentation.Events;

namespace Prism2Demo.Common.Events
{
    public class ViewRequestedEvent : CompositePresentationEvent<string>
    {
    }
}

这是来自 Navigator 模块的事件发布代码:

// Publish ViewRequestedEvent
var eventAggregator = viewModel.Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Publish(workspaceName);

这是事件订阅代码,每个 Workspace 模块都包含在其 Initialize() 方法中:

// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);

Subscribe() 语句与强引用一起显示。

再次感谢您的帮助。

4

1 回答 1

1

有几件事要检查:

Make sure that your EventAggregator instance is being correctly registered with the container or it may itself be garbage collected:

container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());

Also make sure that you have a strong reference to the subscribed object held somewhere (this in your subscription code).

于 2009-12-14T16:22:00.793 回答