2014-02-13 34 views
1

我使用MVP模式創建經由工廠裝載到外殼視圖模塊:保持演示參考活着但無視圖給出參考它控制

public class ViewModuleFactory : IViewModuleFactory 
{ 
    private readonly IEventAggregator Events; 

    public ViewModuleFactory(IEventAggregator Events) 
    { 
    this.Events = Events; 
    } 

    public Control CreateModule() 
    { 
    var view = new View(); 
    var presenter = new Presenter(Events, view); 

    return view; 
    } 
} 

模塊加載後在shell中,我通過Prism Event Aggregator觸發事件來填充模塊。然而,我發現它永遠不會生存。我的結論是,主持人(負責處理該事件)正在收集垃圾,因此公佈的活動充耳不聞。我通過創建一個析構函數並對其進行了簡化來確認這一點。

我可以找出可能的解決方案,但他們提出的警告:

1)我想設置KeepSubscriberReferenceAlive爲真,但another SO answer states this should be a rare occurrence的。

2)我可以給view參考其presenter,但我認爲view應該是完全愚蠢的,並且沒有提及演示者。

3)我可以給ViewModuleFactory一個字段引用Presenter。工廠在該計劃的生命中保持活力,因此主講人的參考資料得以保留,但我認爲這可能會完全打開另一個蠕蟲。

什麼是真正奇怪的是,我在加載完全相同的方式ViewFactory另一個模塊,但不知何故,該演示是沒有得到最終確定這樣的一個。

任何幫助,將不勝感激。

回答

0

我在使用模型 - 視圖 - 演示者模式時遇到過類似的問題,在我看來,選項2是最簡單的方法。

你可以做到這一點沒有「知道」對混凝土主持人具有所有的意見實現以下基本接口視圖:

public interface IView 
{ 
    object Presenter { set; } 
} 

看到,因爲你正在使用的WinForms,你可以有一個基類實現IView接口並將演示者對象存儲在Tag屬性中。

public abstract class ViewBase : UserControl, IView 
{ 
    public object Presenter 
    { 
     set { this.Tag = value; } 
    } 
} 

然後主講基類可被更新以設置IView.Presenter屬性和本身傳遞給視圖,以確保給定值保持活着例如

public class Presenter 
{ 
    public Presenter(View view) 
    { 
     view.Presenter = this; 
    } 
} 

或者,您的視圖類可以只直接持有這樣的演講對象的引用:

public abstract class ViewBase : UserControl, IView 
{ 
    private object _presenter; 

    public object Presenter 
    { 
     set { this._presenter = value; } 
    } 
} 

雖然你的視圖類現在要演示的參考,他們不知道實際主持人的具體類型,只要該字段是私有的,子類實際上不能以任何方式檢索和使用主講者,所以這僅僅成爲您的框架的實現細節,用於將主持人的生命週期與其生命週期關聯視圖。