【问题标题】:How to structure VB.NET Windows Forms applications如何构建 VB.NET Windows 窗体应用程序
【发布时间】:2010-09-20 20:30:02
【问题描述】:
构建 VB.NET Windows Forms 应用程序以便代码可以重用并且应用程序可以轻松扩展的最佳方法是什么?
我曾经创建过很多新表单。这会导致大量重复的代码和执行类似操作的表单。
现在,对于执行类似工作的表单,例如查看/编辑/删除特定数据库表中的项目,我创建一个带有所需控件的表单,让该表单创建一个带有参数的类的实例,例如集合控件和包含数据库表名的字符串。然后各个控件调用类的函数。
高级表单将继承和扩展这个基本表单类。
- 这方面是否已经开展了工作?
- 是否有讨论该主题可用选项的书籍/文章?
【问题讨论】:
标签:
asp.net-mvc
vb.net
winforms
【解决方案1】:
我在这个Passive Screen 模式上取得了巨大的成功。
在我看来,传统 MVC 架构的最大问题是人们在表单类中塞进了太多东西。这会增加您必须执行的手动测试量。
编译后您可以进行的自动化测试越多,您在办公桌上发现的错误就越多。在复杂的应用程序中,即使是很小的更改也会经常发生副作用。
解决这个问题的诀窍是制作一个表单程序集(或 EXE)引用的控制器程序集。每个表单在程序集中都有一个对应的类。单击一个按钮将调用ThisForm.ThisButton(<args>),然后它将触发框架中较低的对象。每个表单都实现了一个接口,因此,如果控制器类需要来自表单的其他信息,它就有一个接口来检索它。
然后,对于您的unit testing,您通过实现虚拟类来触发事件并向控制器类提供信息来模拟执行复杂操作的操作员。控制器类没有任何不同,因为虚拟类实现了所有预期的接口。
有一个重要的例外,那就是琐碎的对话。对于有几个复选框的对话框,我觉得这个组织有点矫枉过正。我经常使用command pattern。因此,在我定义 Command 对象的程序集中,我放置了与该命令关联的 SIMPLE 对话框。对话有多简单才能获得这种处理取决于您。
我喜欢按如下方式构建我的应用程序。
实用程序 - 这是一个包含我一直使用的东西的程序集 - 数学函数、文件函数等。
对象 - 这包含我用于此应用程序的特定对象。
UIFramework - 这定义了所有表单和控制器接口。
Commands - 这包含所有操作我的应用程序对象的 Command 对象。
UI - 实现控制器接口的对象
EXE - 实现表单接口并调用控制器对象的表单。
【解决方案2】:
您可能想查看 Rocky Lhotka 的热门 CSLA Framework。它提供了一种非常结构化的方式来实现业务对象,因此您可以将非 UI 代码排除在表单之外。除了分离您的业务逻辑之外,它还提供内置的 n 级撤消、验证、安全性、数据绑定支持等。
最常针对 CSLA 的一个抱怨是它使测试驱动开发变得困难,因此这也是需要考虑的问题。
【解决方案3】:
使用User Controls 很有帮助。使用用户控件,您可以以不同的形式重复使用相同的 UI。此外,您可以在一个表单上拥有多个用户控件,因此,如果您的表单带有一个包含 5 个选项卡的选项卡控件,则每个选项卡的内容都可以是一个用户控件,而不是将数百个控件全部混合在一个表单中,每个用户控件都有自己的控件和验证逻辑,最终表单中只有六个控件:tabcontrol 和 5 个用户控件。
这无助于将 UI 代码与应用程序逻辑分开,但它使您能够拥有小型的结构化实体,而不是包含数千行代码的表单。