使用 WinForms 的 MVP 模式 - 访问用户输入的正确方法?

MVP Pattern with WinForms - Proper way to access user input?

我正在使用 MVP 模式编写应用程序,并且很好奇是否有 "correct" 方法将用户输入从视图传递到演示者。

例如,我有一个带有文本框和 "Search" 按钮的简单搜索表单。在 Presenter 中,我有一个执行搜索并用结果填充视图的函数。在搜索按钮的 Click 事件中,我调用了 Presenter 中的搜索功能。

我的问题是,最好将用户输入作为参数传递给 Presenter 中的搜索函数,还是在 View 中为 Presenter 创建一个 Get 访问器来检索用户输入更好?

例子-

在视图中:

private void btnSearch_Click(object sender, System.EventArgs e)
{
    presenter.Search(txtUserInput.Text);
}

在演示者中:

public void Search(string userInput)
{
    //perform search
}

在视图中:

public string UserInput
{
    get { return txtUserInput.Text; }
}

private void btnSearch_Click(object sender, System.EventArgs e)
{
    presenter.Search();
}

在演示者中:

public void Search()
{
    string userInput = view.UserInput;

    //perform search
}

我通常使用您的第二种方法来实现它。

Presenter 方法通常不接收任何参数并从 IView 收集数据。

如我所见,视图公开了状态,并且行为在 "stateless" 演示器中实现(唯一的状态是对视图和注入依赖项的引用)。

这提供了一种非常简单的方法来针对 Mock 视图对演示者进行单元测试,并在创建 IViewPresenter:

时提供了非常简单的指南
  • 通过 UI 中的控件公开的所有数据都应该是 IView 界面中的属性(通常作为 ValueTypes 使其与 Winforms 无关)。
  • 所有行为,例如处理每个按钮的逻辑,以及初始化应该是 Presenter 方法。