我正在通過掌握該技術來構建Prism 2.1演示程序。通過事件聚合服務發佈和訂閱CompositePresentationEvents時遇到問題。如果我設置了一個強引用(KeepSubscriberReferenceAlive = true),事件訂閱就可以正常工作,但如果我設置了一個弱引用(KeepSubscriberReferenceAlive被忽略),它就會失敗。棱鏡2.1發佈/訂閱與弱引用?
我想用弱引用來訂閱,這樣我就不必管理從事件中取消訂閱。有沒有辦法做到這一點?爲什麼這裏需要強有力的參考?謝謝你的幫助!
以下是詳細信息:我的演示應用程序是單線程的,有兩個區域,Navigator和Workspace,以及三個模塊NavigatorModule,WorkspaceAModule和WorkspaceBModule。 NavigatorModule有兩個按鈕,'Show Workspace A'和'Show Workspace B'。當單擊其中一個按鈕時,會調用一個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);
這裏是事件訂閱代碼,每個工作區模塊在其Initialize()方法中包含:
// Subscribe to ViewRequestedEvent
var eventAggregator = m_Container.Resolve<IEventAggregator>();
var viewRequestedEvent = eventAggregator.GetEvent<ViewRequestedEvent>();
viewRequestedEvent.Subscribe(this.ViewRequestedEventHandler, ThreadOption.PublisherThread, true);
Subscribe()語句顯示爲一個強有力的參考。
再次感謝您的幫助。
有一個在訂閱()方法記錄的缺陷:http://compositewpf.codeplex.com/WorkItem/View.aspx?WorkItemId=4925&ProjectName=CompositeWPF&PendingVoteId=4925。但是,我不認爲這是我所經歷的原因。我認爲正在創建一個弱引用,但它正在被垃圾收集。 – 2009-12-14 16:06:08
那麼問題是什麼? – GraemeF 2009-12-14 22:17:40