棱镜2.1发布/订阅弱参考?

时间:2009-12-14 15:59:07

标签: prism prism-2

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

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

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

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

using Microsoft.Practices.Composite.Presentation.Events;

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

以下是导航器模块中的事件发布代码:

// 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()语句显示有强引用。

再次感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

要检查的几件事情:

确保您的EventAggregator实例正在向容器正确注册,或者它本身可能是垃圾回收:

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

另外,请确保您对某处保留的订阅对象(订阅代码中为this)有强烈的引用。