0

我正在开发一个具有相当大的 MainForm 的桌面应用程序。在不同级别的多个容器中有很多控件(SplitContainers、TabPages、Panels)。

现在我想通过将负责数据绑定和清除控件或执行用户交互的所有控制器代码分离到单独的控制器类中来重构这个类。

[编辑]

目的

此应用程序的目的是跟踪订单(称为 Job)及其位置(称为 Jobitem)。每个 Job 都与一个客户相关,每个 Jobitem 都与一个 Article 相关(Jobitem 包含特定于其物品制造过程的信息,因此它包裹着该物品)。Job、Jobitem、Customer 和 Article 具有由 PropertyManager 类管理的动态属性(基本键/值对)。

建筑学

我的应用程序分为 2 个主要项目: 核心包含 3 个 LinqToSQL DataContext 类中的数据模型:

  • ArticleManagement
  • JobManagement
  • PropertyManagement

对于每个 DataContext 类,都有一个XyzManager类将集合中的 LinqToSQL 对象提供给 GUI,封装了 LinqToSQL 数据源。它还处理对其相应 DataContext 类型的创建、删除和修改。

然后我有一个 GUI 项目,自然包含一个主窗体和一些附加窗体,如选项等。截至目前,我的 GUI 项目包含对每个 XyzManager 类的引用,并通过 Manager 类获取和设置数据作为用户交互决定,包含所有控制逻辑。

我已将大部分独立逻辑放入主表单类之外的静态实用程序类中,但我猜这不是理想的方法。

[/编辑]

这是我的第一个更大的桌面应用程序,我很难封装 GUI。截至目前,所有负责处理用户交互的控制器代码都位于 MainForm 类中。

我知道 MVC 模式,但我不确定如何使用我当前的设计将它应用到 C# WinForm 上。

仅我的自定义代码就有2400多行代码,不计入表单自动生成的代码,呈上升趋势。我想重构这个,但我不知道如何以更优雅的方式解决这个问题。

4

4 回答 4

3

对于小型应用程序,您应该看看 Model-View-Presenter (MVP),有一个很好的介绍(在我看来)做 MVP 的最佳方法: http ://martinfowler.com/eaaDev/SupervisingPresenter.html

于 2009-06-24T08:00:44.513 回答
2

通常我会尝试使用更小的 UserControls 来组成一个复杂的 GUI。但有几点非常重要:

  • 这些用户控件中的每一个都应该是独立的(尤其是来自表单)
  • 具有显示或更改某些数据的目的的用户控件应该只依赖于这些数据。您应该尝试以一种可以将它们绑定到为控件所需的所有数据提供服务的 DataSource 的方式来实现您的控件。
  • 当您需要将信息移交给父容器(另一个用户控件或窗体)时,请使用容器可以订阅的事件。
  • 当您使用(上下文)菜单时,请检查它们是否绑定到某些项目。您应该在项目附近而不是在用户控件中创建菜单。因此,当您在不同的视图(控件)中多次在 GUI 上显示相同的项目时,每个项目都应该具有相同的上下文菜单。
  • 尝试为按钮/菜单的操作应用命令模式。

您的解决方案听起来像您直到现在才能分开不同的责任。仅仅将代码划分为不同的控件,没有明确的边界和职责是不够的。

于 2009-06-24T07:57:22.083 回答
0

查看复合 UI 应用程序块

于 2009-06-24T07:55:02.293 回答
0

您是否仅将 JobController 用于一种形式?如果是,那么您可能只需要使用partial 关键字将代码拆分成几个文件?

于 2009-06-24T08:19:03.413 回答