c# - 半复杂页面上的 MVP

标签 c# design-patterns mvp presenter-first

我正在处理具有稍微复杂行为的 .NET 3.5 表单应用程序。它用于图书库存。为了给您一个想法,工作流程将是:

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

这是四个职责:

  • 验证 ISBN,
  • 支票簿存在,
  • 显示图书详细信息,
  • 保存新书的详细信息。

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

将其保留在一个 MVP 结构中

  • 使模型更复杂
  • 使测试设置更加复杂(每个测试都有大量设置代码来选择正确的验证器、归还书籍等,即使它们未被使用),
  • 使呈现逻辑更容易理解

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

  • 使模型更简单,
  • 为每个演示者创建更多但更简单的测试,
  • 使演示者之间的交互变得复杂(我如何向演示者发出 ISBN 有效的信号,以便显示图书详细信息?)

我正在尝试 Presenter 第一原则,所以: - 保持 View 哑(所以没有像“Presenter one validated the ISBN”这样的事件), - 保持演示者无状态, - 保持模型简单(足够)

有人知道执行此操作的最佳方法是什么吗?

最佳答案

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

演示者中的这些内容用于处理正在输入的 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 负责显示和输入检索,Presenter 负责管理两者之间的交互。

关于c# - 半复杂页面上的 MVP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/705268/

相关文章:

c# - 不支持写入压缩流。使用 System.IO.GZipStream

c# - 在属性上触发事件/函数? (C#)

java - 如何处理运动流记录? (多处理器)

python - 当参数可能非常大时进行内存

c - 在 C 中记录 ".h"文件使用模式的好引用是什么?

ios - 如何在 iOS Xcode 项目中创建 MVP 和 MVVM 架构

GWT、MVP、GIN、代码拆分?

c# - List<Enum> in Aggregates Entity Framework Code First

android MVP - 应该如何从模型中调用网络层?

c# - 谁拥有放置在剪贴板上的 MemoryStream 对象? (或者应该使用 MemoryStream 以外的东西吗?)