【问题标题】:Webforms MVP Passive View - event handlingWebforms MVP Passive View - 事件处理
【发布时间】:2011-01-27 10:03:16
【问题描述】:

视图是否应该在其接口中没有任何特定事件,并调用演示者普通方法来处理事件并且没有任何官方 EventHandlers?比如

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

第二个似乎需要添加大量管道代码。

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

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

【问题讨论】:

    标签: c# asp.net webforms tdd mvp


    【解决方案1】:

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

    项目类型(例如 Winforms 和 ASP)之间的控件实现方式可能大不相同。

    这意味着界面可能需要针对不同的视图进行修改,这正是我们不想要的。 MVP 的全部意义在于,Presenter 可以依赖于一个稳定的界面,该界面允许 UI 与模型分离、具体视图的轻松替换和可测试性。

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

    【讨论】:

      【解决方案2】:

      在您的视图界面中,您应该有一个对保存按钮的引用,然后一切都在演示器中完成。这使您的视图没有代码,并且您的 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
      }
      

      '

      【讨论】:

        【解决方案3】:

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

        我们的理由是无论如何我们都无法直接对视图进行单元测试(我们使用 waitin 来测试这一层),所以这里的主要目标是让一个可单元测试的演示者尽可能与视图分离/型号。

        根据我的经验,由于野兽的性质,你永远不会在 WebForms 中实现完全干净的 MVP(他们真的很喜欢你只使用文件后面的代码......),所以我不会不要挂断电话。

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

        【讨论】:

          猜你喜欢
          • 2018-08-03
          • 1970-01-01
          • 2011-11-29
          • 1970-01-01
          • 2021-11-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多