我正在重构WinForms(.NET 4)应用程序,该应用程序使用TabControl来包含UserControl - UserControl在每个TabPage中实例化,最终结果是每个选项卡中的编辑器。它们正在编辑一组项目,这些项目最终会被整个表单输入到正在编辑的对象中。
作为示例类结构:
class School
string Name
string Address
Course
的集合,每个都有几个适当的字段(Department
,Name
等)。(这实际上并不是与学校相关的应用程序,但这个比喻有效。)
从视觉上看,UserControls集合管理Course
es,而父表单处理School
信息。
现在,我有一个Form / School的演示者,以及UserControl / Course的演示者,每个人都有一个视图。然而,学校的主持人需要控制课程的一些信息。例如,为一个课程选择的选项限制其他课程中的选项。 School
模型正在处理该计算,但它需要到达课程的演示者。
我在MVP讨论中找到这种关系的例子并没有太大的成功,这是我第一次采用MVP方法。处理这个有什么好办法吗?学校的主持人是否适合收集课程主持人的集合来代表该集?学校的观点是否应该收集课程观点的集合? (最终的UserControls必须以某种方式和某个地方附加到表单上,对吗?)
我的主要目标是(不出所料)提高可测试性和可维护性,到目前为止,主要来源是Michael Feathers的“The Humble Dialog Box”和Jeremy Miller的“Build You Own CAB”系列。
答案 0 :(得分:3)
我如何处理类似的情况是父节目主持人应该知道儿童节目主持人(作为构造函数依赖关系)。
每个儿童主持人都有自己的观点,所以在父主持人中,我的逻辑就像是:
初始化() - 初始化父 - 在每个子演示者上调用初始化(这是为了获取所有必要的数据,除了主要显示的数据。例如,如果您有发票演示者,如果您有客户组合框,则需要从某个地方获取客户集合,以便您可以更改此发票) - 将子视图嵌入父视图(父视图通常是一个表单,其中子项是用户控件)
然后,通常在加载父级时,使用一些LoadXXX方法,我也加载子级。在您的示例中,它将类似于
schoolPresenter.LoadSchool(学校)
反过来会在所有演示者中加载数据,例如加载带有学校详细信息的父级控件,将课程集合传递给课程演示者等......
有人认为我觉得这样做很好,就是在每个演示者上都有一个Refresh()方法,它基本上知道如何根据当前状态加载自己。也许你不能在父节目主持人上有这样的方法,但简单的演示者工作得很好,所以这意味着在LoadSchool方法中你可以有类似的东西
coursesPresenter.Courses = school.Courses; coursesPresenter.Refresh();