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

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

我的问题是,最好将用户输入作为参数传递给Presenter中的搜索功能,还是最好在View中创建Get访问器以供Presenter检索用户输入?

范例-

在视图中:

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方法。

如我所见,视图公开状态,并且行为是在“无状态” Presenter中实现的(唯一的状态是对视图的引用和注入的依赖项)。

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


通过UI中的控件公开的所有数据都应该是IView界面中的属性(通常是ValueTypes,使其与Winforms无关)。
所有行为,例如用于处理每个按钮的逻辑以及初始化,均应为Presenter方法。

关于c# - 带有WinForms的MVP模式-访问用户输入的正确方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30174769/

10-09 07:18