半复杂页面上的MVP

时间:2009-04-01 12:28:45

标签: c# design-patterns mvp presenter-first

我正在使用.NET 3.5表单应用程序,行为稍微复杂一些。这是一本书库存。为了给你一个想法,工作流程将是:

  • 用户输入ISBN代码
  • 如果ISBN有效,请检查它是否存在,
  • 如果它有效并且存在,则显示书籍详细信息并启用保存按钮,否则,显示“添加书籍”按钮,
  • 如果无效,请显示错误,
  • 最终,用户将点击“保存”,因此必须保存该条目。

这有四个责任:

  • 验证ISBN,
  • 检查书的存在,
  • 显示图书详情,
  • 保存新书详情。

我的问题是:我应该将应用程序逻辑保留在一个MVP结构中还是应该将其拆分为四个MVP结构,每个责任一个?

将其保存在一个MVP结构中

  • 使模型更复杂
  • 使测试设置更复杂(每个测试的大量设置代码,以选择正确的验证器,返回书籍等,即使它们没有被使用),
  • 使演示逻辑更容易理解

将其保存在单独的MVP结构中

  • 使模型更简单,
  • 为每位演示者创建更多但更简单的测试,
  • 在演示者之间的交互中增加了复杂性(如何向演示者发出ISBN有效的信号,以便可以显示书籍详细信息?)

我正在尝试Presenter第一原则,所以: - 保持视图愚蠢(所以没有像“Presenter one valid the ISBN”这样的事件), - 让演示者无国籍, - 保持模型简单(足够)

任何人都知道最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

我会选择一位Presenter,但将ISBN编号的验证等委托给服务。

演示者在这些行中处理正在输入的ISBN的内容:

public void IsbnEntered()
{
    var isbn = view.Isbn;

    if (isbnService.NumberIsValid(isbn))
    {
        var details = isbnService.RetrieveDetailsForIsbn(isbn);

        if (details != null)
        {
            view.Display(details);
            view.EnableSaveButton();
        }
        else
        {
            view.DisplayError("ISBN could not be found");
        }
    }
    else
    {
        view.DisplayError("Invalid ISBN");
    }
}

这里的职责定义明确。 IsbnService负责ISBN处理,View for display和输入检索,Presenter负责管理两者之间的交互。