我正在通过加速技术来构建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()语句显示有强引用。
再次感谢您的帮助。
答案 0 :(得分:1)
要检查的几件事情:
确保您的EventAggregator
实例正在向容器正确注册,或者它本身可能是垃圾回收:
container.RegisterType<IEventAggregator, EventAggregator>(new ContainerControlledLifetimeManager());
另外,请确保您对某处保留的订阅对象(订阅代码中为this
)有强烈的引用。