关于良好的编程设计,我有几个问题。我将首先描述我正在建设的项目,这样你就能更好地帮助我。
我正在编写类似于TeamViewer,Microsoft远程桌面,CrossLoop的远程协助工具。它将包含诸如UDP网络(使用Lidgren网络库),NAT遍历(因为许多计算机现在在路由器后面不可见),镜像驱动程序(使用DFMirage的镜像驱动程序(http://www.demoforge.com/dfmirage.htm)进行实时屏幕抓取等概念。远程计算机)。
话虽这么说,这个程序的概念是一个客户端 - 服务器架构,但我只用了一个具有客户端和服务器功能的程序。这样,当用户运行我的程序时,他们可以在提供帮助和接收帮助之间切换,而无需下载单独的客户端或服务器模块。
我有一个Windows窗体,允许用户在提供帮助和接收帮助之间进行选择。我有一个文件浏览器模块的另一个Windows窗体。我有一个聊天模块的Windows窗体。我有一个注册表编辑器模块的另一个Windows窗体表单。我有另一个用于实时控制模块的Windows窗体。所以我为每个模块都有一个表格,这引出了第一个问题:
1。我应该在相应Windows窗体的代码中处理特定于模块的命令吗?含义,假设我得到一个命令,其中包含一些枚举特定目录的远程用户文件的数据。显然,我必须在文件资源管理器Windows窗体上更新它,并将条目添加到ListView。我应该在Windows窗体中处理此代码吗?或者我应该在另一个类中处理这个(当然,我必须最终将数据传递给表格来绘制)。或者它就像一个混合体,我在其中处理另一个类中的大部分数据并将最终结果传递给Form来绘制?
所以我有5-6个表格,每个模块一个。用户启动我的程序,输入远程机器的ID(不是IP,ID,因为我们正在注册中间服务器以启用NAT遍历),密码和连接。现在让我们假设连接成功。然后向用户呈现具有所有不同模块的表单。所以他可以打开文件资源管理器,或者他可以搞乱注册表编辑器,或者他可以选择与他的好友聊天。所以现在程序有点空闲,等待用户做某事。如果用户打开实时控制,则程序将花费大部分时间从远程计算机接收数据包并将其绘制到表单以提供“实时”视图。
2. 第二个设计问题。一个分拆问题#1。 我如何将特定于模块的命令传递到各自的Windows窗体?我的意思是,我有一个像“NetworkHandler.cs”这样的类来检查来自远程计算机的消息。 NetworkHandler.cs是一个可全局访问的静态类。所以假设我得到一个枚举特定目录的远程用户文件的命令。 如何将“该命令提供给文件资源管理器表单。我正在考虑在NetworkHandler中创建一个OnCommandReceivedEvent,并让每个表单注册到该事件。当NetworkHandler收到命令时,它会引发事件,所有表单都会检查它是否相关,并且相应的表单将采取行动。这是一个合适的/最好的解决方案吗?
第3。我正在使用的网络库Lidgren提供了两种检查网络消息的选项。可以轮询ReadMessage()以返回null或消息,或者可以使用AutoResetEvent OnMessageReceived(我猜这是像一个事件)。哪一个更合适?
答案 0 :(得分:1)
在表单中放入尽可能少的代码。您应该创建一个单独的类/类集来处理这个并使表单使用它们来绘制。
事件似乎是一个好主意。我不会让表单订阅,但是让另一个类进行处理并将处理后的数据传递给表单(通过另一个事件)。
我会使用这个事件,因为它可能会检查异步,这就是你想要的。您不希望在等待消息时锁定表单。