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

什么是 好的 演示者的粒度?

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

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

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

请注意,在这两种情况下,1-presenter-1-view 都是可以实现的。所谓的“1-view”发生了变化。

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

  • 细粒度的主讲者和 可定制 通过选项或类似性质的行为?
  • 粗粒度的演示者和低演示者可重用性?
  • 还有别的事吗?

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

有帮助吗?

解决方案

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

其他提示

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

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

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

层次结构看起来像这样

查看EXE主持人实现命令组件 - 命令由演示者执行,该命令修改模型演示者接口模型组件

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

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

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

我的设置的最大问题(也是我没有得到很好答案的问题)是当前的 IDE 和语言使得将用户控件与数据库记录绑定起来变得非常容易。与任何其他设置相比,它是如此高效,以至于它往往主导设计。我不必在 CAD-CAM 应用程序中处理太多问题,因此除了将数据集传递到视图并让它处理它之外,我没有任何答案。 这个网站 有一些在这种情况下可能有用的模式。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top