2010-03-14 75 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与模型分离,轻松替换具体视图和可测试性。

更好地坚持接口上的属性和方法,而不依赖于任何特定的控件,并将实现细节留给具体的视图。