C# Webforms MVP被动视图-事件处理

C# Webforms MVP被动视图-事件处理,c#,asp.net,webforms,tdd,mvp,C#,Asp.net,Webforms,Tdd,Mvp,视图是否应该在其接口中没有特定于事件的内容,并调用presenter普通方法来处理事件,而没有任何正式的EventHandler?比如说 // ASPX protected void OnSaveButtonClicked(object sender, EventArgs e) { _Presenter.OnSave(); } 或者视图是否应该在其接口中定义事件处理程序,并显式链接这些事件处理程序以控制页面上的事件 // View public interface IView

视图是否应该在其接口中没有特定于事件的内容,并调用presenter普通方法来处理事件,而没有任何正式的EventHandler?比如说

// 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;
    }
第二个看起来像是要添加很多管道代码

我的意图是了解每种风格的好处,而不仅仅是使用哪种风格的笼统答案。我的主要目标是清晰性和高价值的可测试性。总体而言,可测试性很重要,但我不会牺牲设计的简单性和清晰性,以便能够添加另一种类型的测试,而这种测试不会比使用更简单的设计已经可能实现的测试用例获得太多收益。如果一个设计选择没有更多的可测试性,请包括一个它现在可以提供的测试类型的示例(伪代码很好),这样我就可以做出决定,如果我足够重视这种额外的测试类型。谢谢


更新:我的问题需要进一步澄清吗?

在视图的界面中,您应该有一个对“保存”按钮的引用,然后在presentor中完成所有操作。这使您的视图中没有代码,并且您的Presineter易于测试

// 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
}

我们刚刚使用webforms实现了MVP,并选择了一个更简单的选项,即在演示者上直接为按钮事件等使用视图调用方法

我们的理由是,无论如何我们都无法直接对视图进行单元测试(我们使用waitin来测试这一层),因此这里的主要目标是拥有一个可单元测试的演示器,它尽可能与视图/模型分离

根据我的经验,由于beast的性质,无论如何,您永远无法在WebForms中实现完全干净的MVP(他们真的很希望您只使用文件后面的代码…),所以我不会挂断它


在一天结束时,您需要评估分离视图和表示逻辑的原因,并确定这两种方法以后是否会帮助/阻碍您……

我不喜欢在界面中明确引用按钮(或任何其他控件)。这意味着我们与控件的实现紧密相连

在不同的项目类型(例如Winforms和ASP)之间,控件的实现方式可能非常不同

这意味着该接口可能需要针对不同的视图进行修改,而这正是我们不想要的。MVP的全部要点是,演示者可以依赖一个稳定的界面,该界面允许用户界面与模型分离,易于替换具体视图和可测试性

最好在接口上使用不依赖于任何特定控件的属性和方法,并将实现细节留给具体视图