2009-12-14 18 views
3

我正在通過掌握該技術來構建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()語句顯示爲一個強有力的參考。

再次感謝您的幫助。

+0

有一個在訂閱()方法記錄的缺陷:http://compositewpf.codeplex.com/WorkItem/View.aspx?WorkItemId=4925&ProjectName=CompositeWPF&PendingVoteId=4925。但是,我不認爲這是我所經歷的原因。我認爲正在創建一個弱引用,但它正在被垃圾收集。 – 2009-12-14 16:06:08

+0

那麼問題是什麼? – GraemeF 2009-12-14 22:17:40

回答

1

幾件事情要檢查:

確保您EventAggregator實例與容器中正確註冊或者它可能本身是垃圾回收:

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

另外,還要確保你有一個對訂閱對象的強引用(您的訂閱代碼中有this)。

+0

謝謝,格雷姆。我不確定關注對訂閱對象的字符串引用。你可以擴展一點,也許提供一個示例代碼行?再次感謝。 – 2009-12-14 20:04:55

+0

做一個「強有力的參考」 - 對此感到抱歉! – GraemeF 2009-12-14 20:46:55

+0

我的意思是確保訂戶對象本身不被收集(我相信你已經擁有:) – GraemeF 2009-12-14 20:51:41