【问题标题】:MVP and presenter granularityMVP 和 Presenter 粒度
【发布时间】:2010-12-10 19:57:53
【问题描述】:

我们一直在使用 MVP 模式和 Winforms 并取得了相当大的成功。但是,关于 MVP 的问题总是会弹出:

对于演示者来说,好的粒度是什么?

我的意思是:对于 Winforms,细粒度通常非常适合用户控件。这样,在设计更复杂的 GUI 时,很容易重用用户控件并将它们用作构建块。但是,与演示者具有相同的(精细)粒度似乎是一个问题。

一方面,拥有粗粒度的演示者会阻碍使用“插件”控件的能力,并且有点违反 DRY 原则:多个演示者通常需要实现相同的逻辑(填充例如,客户列表),供多个更复杂的控件使用。

另一方面,细粒度的演示者似乎限制了在不同情况下重用控件的能力。例如,编辑视图有时可能需要立即保存客户;有时它需要将其链接到其他东西;有时只需要验证它;等等。它通常取决于更复杂的控制。但也有相当多的共同行为。

请注意,在这两种情况下,1-presenter-1-view 都是可以实现的。什么是“1-view”变化。

什么通常被认为是使用 MVP 和 Winforms 的演示者粒度的最佳实践?

  • 细粒度的演示者和可自定义的行为通过选项或类似性质的东西?
  • Presenter 粗粒度且 Presenter 可重用性低?
  • 还有别的吗?

免责声明:我们主要使用监督控制器,但我认为它也适用于被动视图。也很抱歉问了这么长的问题。

【问题讨论】:

    标签: c# winforms mvp


    【解决方案1】:

    我们在所有客户中都使用 MVP,这绝对是不止一次出现的对话。我们的类和演示者背后的代码应该有多干净?话虽如此,我们选择使用粗粒度的presenter方法。基本上,每个表单都有自己的演示者,并且只会使用其视图获取和设置特定表单上任何控件的属性。填充控件(例如调用数据库以填充组合框)位于公共服务类中。用户输入数据的任何验证都位于 BO 类中,任何和/或所有演示者都可以重用该类。我希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      在我的 CAD-CAM 系统中,我的演示者不使用用户控件。用户控件驻留在视图中,该视图驻留在执行演示者使用的视图接口的 EXE 程序集中。

      如果要显示客户列表,我将其交给具有 DisplayCustomerList 的视图,并且它使用显示客户列表所需的任何用户控件组合。如果多个视图以相同的方式显示客户列表,那么在 ExE/View 程序集中,它们共享一个用户控件或类来执行此操作。该类不会超出该程序集。

      我们的软件适用于运行许多不同类型的金属切割机。所以我们非常重视能够撕掉 UI 并用完全不同的 UI 替换它(对应于不同的机器)。所有这些 UI 都引用同一组核心程序集。

      层次结构是这样的

      查看 EXE 演示者实现 命令汇编 - 命令由修改模型的演示者执行 演示者界面 模型组件

      旁边是可加载程序集,它们定义动态内容,例如可以加载的文件类型、报告、切割设备驱动程序等。这些实现了模型程序集中的各种接口

      我要做的一件事是,我不会为每个对话都设置视图演示者。如果对话框与命令紧密绑定,则它与命令类一起定义、创建和使用。有时一组相关的命令会共享一个对话框(例如文件处理)。

      我在使用 MVP 时提出的基本问题是“如果想用其他东西完全替换表单会发生什么?”。该问题的答案将确定您在哪里过于依赖特定的用户控件或表单引擎。

      我的设置最大的问题(也是我没有得到很好答案的问题)是当前的 IDE 和语言可以很容易地将用户控件与数据库记录联系起来。与任何其他倾向于主导设计的设置相比,它的生产力如此之高。我不必在我的 CAD-CAM 应用程序中处理太多问题,所以除了将数据集传递给视图并让它处理它之外,我没有任何答案。 This site 有一些可能在这种情况下有用的模式。

      【讨论】:

      • 我了解演示者与任何类型的用户控制没有直接关系。困境是让他们中的很多人与他们自己的演示者交谈,还是让最终表格为他们做所有的“谈话”。不过,这很有帮助,谢谢。
      • 如果用户控件或用户控件组对自己形成一个完整的视图,我会这样做。例如,您有一个选项卡式 UI,当您单击不同的选项卡以在相同数据的不同视图之间切换时。在这种情况下,每个选项卡都将是一个与包含整个表单的视图相关的视图
      猜你喜欢
      • 2014-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-05-26
      • 1970-01-01
      相关资源
      最近更新 更多