5

我正在重构一个 WinForms (.NET 4) 应用程序,该应用程序使用 TabControl 来包含一个 UserControl——UserControl 在每个 TabPage 中实例化,最终结果是每个选项卡中的编辑器。这些正在编辑一组项目,这些项目最终会输入到整个表单正在编辑的对象中。

作为示例类结构:

  • class School
    • string Name
    • string Address
    • s 的集合Course,每个都有几个适当的字段(DepartmentName等)

(它实际上不是与学校相关的应用程序,但比喻有效。)

在视觉上,UserControls 集合管理Coursees,而父 Form 处理School信息。

现在,我有一个 Form/School 的演示者和一个 UserControl/Course 的演示者,每个都有一个视图。然而,学校的演示者需要控制课程的一些信息。例如,为一门课程选择的选项会限制其他课程的选项。该School模型正在处理该计算,但它需要到达课程的演示者。

我在 MVP 讨论中找到这种类型关系的例子并没有取得多大成功,这是我第一次采用 MVP 方法。处理这个问题有什么好的选择?学校的演示者是否适合拥有课程演示者的集合来代表该集合?学校的观点应该持有课程观点的集合吗?(最终的 UserControls 最终必须以某种方式和某处附加到表单,对吗?)

我的主要目标是(毫不奇怪)提高可测试性和可维护性,到目前为止,该过程的主要来源是 Michael Feathers 的“The Humble Dialog Box”和 Jeremy Miller 的“Build You Own CAB”系列。

4

1 回答 1

3

我如何处理类似情况是父演示者应该了解子演示者(作为构造函数依赖项)。

每个子演示者都有自己的观点,所以在父演示者中,我的逻辑类似于:

Initialize() - 初始化父 - 在每个子演示者上调用初始化(这是为了获取所有必要的数据,除了主要显示的数据。例如,如果您有一个发票演示者,如果您愿意,您需要从某个地方获取客户集合有客户组合框,以便您可以更改发票) - 将子视图嵌入父视图(父视图通常是表单,子视图是用户控件)

然后在那之后,通常在加载父级时,使用一些 LoadXXX 方法,我也加载子级。在您的示例中,它将类似于

schoolPresenter.LoadSchool(学校)

这将反过来加载所有演示者的数据,例如加载带有学校详细信息的家长控件,将课程集合传递给课程演示者等......

有人认为我注意到这样做很好,就是在这些演示者中的每一个上都有一个 Refresh() 方法,它基本上知道如何根据当前状态加载自己。也许您不能在父演示者上使用这样的方法,但是简单的演示者可以像这样正常工作,这意味着在 LoadSchool 方法中您可以使用类似的方法

coursesPresenter.Courses = 学校.Courses; 课程Presenter.Refresh();

于 2012-02-09T07:31:40.693 回答