2010-12-02 70 views
2

我正在實現與Windows窗體的MVP模式,我有一個關於當前實現的問題,因爲我試圖將其應用到更復雜的體系結構中。 現在我有一個完全不可知的視圖與屬性,主持人注入視圖在構造函數和視圖有一個演示實例。這是代碼: 查看MVP流問題

public class MyView : IMyView 
{ 
    public MyView() 
    { 
     var presenter = new MyPresenter(this); 
     presenter.Init(); 
    } 
} 

這是演示

public class MyPresenter 
{ 
    private IMyView view; 
    private MyModel model; 
    // 
    public MyPresenter(IMyView view) 
    { 
     // injection 
     this.view = view; 
    } 
} 

這樣,我可以完成兩項任務:從演示

  • 呼叫方法查看
  • 與查看演示 現在,我有兩個問題:
  • 要協調我使用IoC容器的一切,讓我可以輕鬆地寫出像這樣的代碼:

    var view = ioc.Resolve<IMyView>(); 
    var presenter = ioc.Resolve<MyPresenter>(); //view injected 
    NavigationService.Show(presenter.View); 
    

    到目前爲止好。

  • 第一個問題:如何在作業完成後從演示者處取回模型? View所使用的演示者與IoC容器中使用的演示者不同,因爲View本身實例化一個新的演示者...所以Presenter公開的模型與View中實例化的演示者所使用的模型並不相同,因爲該演示者在視圖

  • 第二個問題:當我有一個模型時,如何將現有模型傳遞給此MVP三元組?例如,如何讓此代碼適用於詳細信息視圖其中模型來自存儲庫?

回答

0

基於此,我將通過反轉依賴關係來改變一切。 視圖現在不創建一個演示的實例,但它得到一個由演講本身按以下方式注入:

public MyPresenter(IView myView, Model myModel) 
{ 
    this.View = myView; 
    this.View.Presenter = this; 
    this.Model = myModel; 
} 

到目前爲止,一切都很好。 現在在觀察側,演示公開爲一個只寫屬性,使之無法通過查看更改,但它只能用於:

public class MyView : IView 
{ 
    public MyPresenter Presenter { get; private set; } 
} 

到目前爲止好。 現在,國際奧委會將做到這一點:

var view = IoC.Resolve<IView>(); 
var model = repository.GetModel(); // or new Model(); 
var presenter = IoC.Resolve<MyPresenter>(); //view and model injected 
presenter.ShowView(); 
var result = presenter.Model; 

對於我來說,它看起來不錯,但我只是想確保我不會打破MVP邏輯。

3

有一個更清潔的方式注入模型演示,也

public class MyPresenter 
{ 
    private IMyView view; 
    private MyModel model; 

    public MyPresenter(IMyView view, MyModel model) 
    { 
     this.view = view; 
     this.model = model 
    } 
} 

通過這樣做,你總是有,你創建它的主持人以外的模型的參考。

當你這樣做時,你總是可以選擇你想要使用的模型。 例如,如果您的後端(您的模型)沒有完成,您可以編寫一個模擬模型(當您使用該模型的接口時)來測試演示者和視圖。

希望這對我有幫助

+0

好的,我沒有想到這種類型的解決方案。 – Raffaeu 2010-12-02 14:14:20