2010-03-14 72 views
6

視圖應該在其接口中沒有特定事件,並調用演示者純方法來處理事件並且沒有任何官方EventHandler?例如Webforms MVP被動視圖 - 事件處理

// ASPX 
protected void OnSaveButtonClicked(object sender, EventArgs e) 
{ 
    _Presenter.OnSave(); 
} 

還是應該的觀點已經在它的接口定義和鏈接那些高達明確地控制頁面上的事件事件事件處理器

// View 
    public interface IView 
    { 
... 
     event EventHandler Saved; 
... 
    } 

// ASPX Page implementing the view 
    protected override void OnInit(EventArgs e) 
    { 
     base.OnInit(e); 
     SaveButton.Click += delegate { Saved(this, e); }; 
    } 

// Presenter 
    internal Presenter(IView view,IRepository repository) 
    { 
     _view = view; 
     _repository = repository; 
     view.Saved += Save; 
    } 

第二個好像全世界很多管道代碼添加遍。

我的目的是瞭解每種風格的好處,而不僅僅是一個全面的答案。我的主要目標是清晰度和高價值的可測性。整體可測試性非常重要,但我不會犧牲設計的簡單性和清晰性,以便能夠添加另一種類型的測試,這種測試不會導致對測試用例的增益過高,這種情況已經可以通過更簡單的設計實現。如果一個設計選擇不能提供更多的可測試性,請包含一個現在可以提供的測試類型的示例(僞代碼很好),以便我可以做出決定,如果我足夠重視這種額外測試類型的話。謝謝!

更新:我的問題是否需要進一步澄清?

回答

-3

在您的視圖界面中,您應該有一個對保存按鈕的引用,然後所有事情都在提交者中完成。這使您的視圖免於代碼,並且您的preseneter可以輕鬆測試。

// View interface 
public interface IView 
{ 
    Button SaveButton; 
} 

// View code behind 
public Button SaveButton 
{ 
    get { return btnSave; } 
} 

// Presenter 
internal Presenter(IView view,IRepository repository) 
{ 
    _view = view; 
    _repository = repository; 
    view.SaveButton.Click += new EventHandler(Saved);; 
} 

void Saved(object sender, EventArgs e) 
{ 
    // do save 
} 

'

1

我們使用web表單只是實現MVP,並選擇了具有直接按鈕事件等對主持人的看法調用方法的簡單的選擇

我們的理由是,我們無法直接對視圖進行單元測試(我們使用waitin來測試這個圖層),所以這裏的主要目標是讓一個單元可測試的演示者儘可能與視圖/模型分離。

從我的經驗來看,無論如何,由於野獸的性質(他們真的會愛你只是在文件後面使用該代碼...),你永遠不會在WebForms中實現完全乾淨的MVP,所以我不會不要掛上它。

在這一天結束時,你需要評估分離出視圖和表示邏輯的原因,並確定這兩種方法是否會幫助/稍後阻礙你....

6

我不t喜歡在界面中明確引用Button(或任何其他控件)。這意味着我們與控制的實施緊密相連。

在項目類型(例如Winforms和ASP)之間,控件可以非常不同地實現。

這意味着接口可能需要修改不同的視圖,這正是我們不想要的。 MVP的重點在於Presenter可以依賴一個穩定的接口,允許將UI與模型分離,輕鬆替換具體視圖和可測試性。

更好地堅持接口上的屬性和方法,而不依賴於任何特定的控件,並將實現細節留給具體的視圖。