簡體   English   中英

這是有效的MVP模式實現嗎

[英]Is this a valid MVP Pattern Implementation

我正在嘗試分析一些使用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。 但是,缺少實際模型以及設置View => Presenter => View關系的方式對我來說有點討厭嗎?

那么以上情況是MVP模式的有效實現嗎?

幾乎是MVP,因為您的Presenter與視圖分離的方式是,它在更新UI狀態時會通過IFooView界面進行更新。 但是,在演示者中使用符合標准.NET事件處理程序的方法對我來說似乎是錯誤的。 我將使IFooView在發生按鈕單擊時引發一個事件,然后您的頁面可以像當前一樣執行處理按鈕單擊的任務,然后引發Presenter處理的事件。 這個事件可以更密切相關的領域,比如你可能要等事件RecordUpdated通過你暴露IFooView

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

如果您沒有來自后端服務或數據庫的任何數據,那么在簡單應用程序的情況下,Presenter也可以擔當模型的角色。 在您的瑣碎示例中就是這種情況。 在MVVM中可以執行相同的操作,其中ViewModel也可以承擔Model職責。 但是,如果您做任何不重要的事情,我建議您創建一個模型。 在您的情況下,演示者將委托模型維護狀態,並使用某種“服務”將對模型的更改持久化,或從Web服務中檢索模型對象。

是的。

但是...我應該將presenter結構更改為FooPage構造函數。 有時您想處理preInit事件,而這種設置是不可能的。

是的,這是模型視圖演示者的“被動視圖”變體。 在此變體中,視圖完全不了解該視圖。 該視圖是愚蠢的,並且完全由演示者控制。

FVP在2004年描述了MVP模式,他在2006年將MVP模式分為監督者 (sc)和被動視圖 (pv) 退休 在sc中,視圖綁定到模型,而在pv中則不綁定,在pv中,視圖僅由演示者直接更改。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM