看来您已经陷入了一些常见的陷阱,但是请放心,可以解决这些问题:)
首先,您需要以不同的方式看待您的应用程序,然后开始将其分解为大块。我们可以将块分割成两个方向。首先,我们可以将控制逻辑(业务规则,数据访问代码,用户权限代码以及所有这些东西)与UI代码分开。其次,我们可以将UI代码分解为大块。
因此,我们将首先进行后一部分,将UI分成多个部分。最简单的方法是拥有一个主机窗体,在该窗体上可以将用户控件与用户控件组合在一起。每个用户控件将负责表单的区域。因此,假设您的应用程序有一个用户列表,当您单击某个用户时,该用户下方的文本框将填充其详细信息。您可以让一个用户控件管理用户列表的显示,而让另一个控件管理用户详细信息的显示。
真正的窍门是如何管理控件之间的通信。您不希望表单上的30个用户控件全部随机地保持彼此之间的引用并在它们上调用方法。
因此,您可以为每个控件创建一个接口。接口包含控件将接受的操作及其引发的任何事件。考虑此应用程序时,您无需担心列表框列表选择是否更改,您对新用户已更改的事实很感兴趣。
因此,使用示例应用程序,用于托管用户列表框的控件的第一个界面将包括一个名为UserChanged的事件,该事件将用户对象传递出去。
这很棒,因为现在如果您对列表框感到厌烦,并且想要一个3d zoomy魔术眼控制,只需将其编码到相同的界面并插入:)
好的,第二部分,将UI逻辑与域逻辑分开。好吧,这是一条破旧的道路,我建议您在这里查看MVP模式。真的很简单。
每个控件现在都称为一个视图(MVP中的V),我们已经介绍了上面需要的大部分内容。在这种情况下,控件及其接口。
我们要添加的只是模型和演示者。
该模型包含管理应用程序状态的逻辑。您知道这些东西,它将进入数据库以获取用户,在添加用户时将其写入数据库,依此类推。这个想法是您可以将所有这些与其他所有事物完全隔离地进行测试。
演示者的解释有些棘手。它是一个位于模型和视图之间的类。它是由视图创建的,并且该视图使用我们前面讨论的界面将自身传递给演示者。
演示者不必具有自己的界面,但是无论如何我都喜欢创建一个。使您想要演示者做的事情变得明确。
因此,演示者将公开诸如ListOfAllUsers之类的方法,View将使用该方法来获取其用户列表,或者,您可以将AddUser方法放入View并从演示者中调用该方法。我更喜欢后者。这样,演示者便可以在需要时将用户添加到列表框中。
Presenter还具有CanEditUser之类的属性,如果可以编辑所选用户,则该属性将返回true。然后,View将在每次需要知道时进行查询。您可能需要黑色的可编辑文本,而灰色的只读文本。从技术上讲,这是针对View的决定,因为View是针对UI的,首先用户是否可编辑是针对Presenter。演示者知道是因为它与模型对话。
因此,总而言之,请使用MVP。Microsoft提供了一种称为SCSF(智能客户端软件工厂)的产品,该产品以我所描述的方式使用MVP。它也做很多其他事情。这很复杂,我不喜欢他们做所有事情的方式,但这可能会有所帮助。