2012-01-24 92 views
2

我想在這裏分析一些代碼,一直使用MVP方法設計的。沒有使用特定的MVP框架。這是所有手寫代碼。這是一個有效的MVP模式實現

//Interface Representing our View 
public interface IFooView 
{ 
    string SomeScreenValue 
} 

//Presenter Implementation 
public class FooPresenter 
{ 
    private readonly IFooView _view; 

    public FooPresenter (IFooView view) 
    { 
     //The presenter gets instantiated with a reference to a view. 
     _view = view 
    } 

    public void SomeButton_Click(object sender, EventArgs e) 
    { 
     _view.SomeScreenValue = "The Result"; 
    } 
} 

//The Page Implementation 
public class FooPage : System.Web.UI.Page, IFooView 
{ 
    private FooPresenter _presenter; 

    protected void Page_Init(...) 
    { 
     _presenter = new FooPresenter(this); 
     //<-- The View has a Presenter, which references the same View... 
     Button1.Click += new EventHandler(_presener.SomeButton_Click); 
    } 
} 

它的作用在於,它允許開發人員將業務邏輯從代碼背後移到類中,同時仍影響視圖。但是實際模型的缺乏以及設置View => Presenter => View關係的方式對我來說有點令人討厭?

那麼,上述情況的有效實現MVP模式的?

回答

4

這是差不多 MVP,因爲您的Presenter從視圖中分離出來,使得當它更新UI狀態時,它通過IFooView界面進行操作。但是,在演示者中使用符合標準.NET事件處理程序的方法對我來說似乎是錯誤的。當發生按鈕點擊時,我會讓IFooView引發一個事件,然後您的頁面可以像您當前那樣執行處理按鈕單擊的任務,然後引發Presenter處理的事件。此事件可能與域更密切相關,例如,您可能希望通過IFooView公開事件,如RecordUpdated

這將使得更容易爲單元測試提供IFooView的模擬實現,這畢竟是使用MVP/MVC/MVVM模式的一大優勢。

如果你沒有任何數據從後端服務或數據庫來了,那麼在簡單的應用程序的情況下,它是確定的主持人採取對模型的角色。在你的微不足道的例子中就是這種情況。 MVVM也可以做到這一點,ViewModel也可以承擔Model的職責。不過,如果你做任何不重要的事情,我會建議創建一個模型。在你的情況下,Presenter將委託給維護狀態的模型,並使用某種'服務'來保存對這個模型的更改,或者從Web服務中檢索模型對象。

+0

那麼在這個例子中究竟是什麼「模型」。或者,模型就是用於從中獲取數據的不同數據源的鬆散分組。 –

+0

@EoinCampbell我已經更新了我的回答 – ColinE

+0

好的。說得通。上面的例子是從一個簡單的UI屏幕中提取的,該屏幕從文本框和DDL中獲取3或4個值,使用查詢命中DataAccess Manager並獲取綁定到GridView的結果集。隨後的調用可能包括分頁和訂單子句,但它本質上是一個簡單的Populate-GridView屏幕,直接從演示者調用DAL。 –

2

是的。

但是...... 我應該改變主持人建設FooPage構造來代替。有時你想處理preInit事件,這是不可能的這個設置。

1

是的,這是模型視圖主持人的「被動視圖」變種。在這個變體中,視圖不知道任何視圖。這個觀點是愚蠢的,並由主持人完全控制。

MVP模式在2004年由Fowler描述,他在retired it in 2006中將模式分成supervising conroller(sc)和Passive View(pv)。在sc中,視圖與模型綁定,而在pv中,視圖僅由演示者直接更改。

相關問題