日期:2014-05-17  浏览次数:20943 次

问一个项目开发架构问题
需求是这样的:

1、WinForm程序
2、多人开发,每人实现不同模块功能
3、整个项目和后台建立一个TCP连接,每个模块都要与后台TCP通讯

现已做好和后台的TCP连接类,预想的架构是每个人开发一个UserControl,主程序加载UserControl时将TCP连接对象作为参数传入。这样的话主程序和每个模块程序都要有TCP连接类的定义(不同项目中TCP连接类的命名空间都相同),当要将TCP连接类对象作为参数传入时编译通不过,说不能转换改类型。

尝试用Marshal.StructureToPtr后再传也不行,不知改怎么弄了,请高人指教。也许我这个架构本身有问题,该怎么改比较好呢?
tcp winform 通讯 架构

------解决方案--------------------
你的TCP连接对象说得太笼统,如果是一个封装有tcpclient之类的自定义类,各模块直接引用通信模块就可以了,这种应用很常见。但说得简单,实现通信模块并不容易,比如要考虑多线程问题,可能需要建立通信队列等等。
------解决方案--------------------
引用:
这样的话主程序和每个模块程序都要有TCP连接类的定义(不同项目中TCP连接类的命名空间都相同)


不会每个模块都定义了一个类吧,只需要在一个dll的工程中定义一次即可。其它工程引用这个工程。
------解决方案--------------------
引用同一个dll就可以了,没必要传什么参数
------解决方案--------------------
个人见解

我觉得应该定义一个共用类,让这个类和TCP进行通讯,然后各个模块引用这个类,那么所有的通讯内容的转化都应该在这个类中进行处理
------解决方案--------------------
如下建议:

1.TCP连接对象  ——  这类可能操作硬件通讯的 类,个人觉得 不要进行封装传递 比较好;
     你可以 将 IP地址,端口  等信息 封装传递,在统一的地方  重建 “TCP连接对象”;

2.Marshal  看到这个单词,我敏感的觉得:序列化 可能得注意点啥子;
3.“而且我的想法是每个人的UserControl编译成dll供主程序调用,而不是代码和主程序代码一块编译,这样方便日后的升级”——是否 UserControl  有统一的接口?  插件式程序扩展升级  都以接口的标准。
4.Re "g767160":这个答案 很标准——这类似 一种命令模式,将需要执行的 过程和返回值 封装成一个对象,统一调用 某些对象 处理;

——————————————————————————————————————
以上回答,并没有完全针对楼主的 BUG;
只是觉得 假如是自己的话,自己可能得注意哪些要点。

------解决方案--------------------
为端对开发人员定义一个UC基类,成员定义UC时均继承于基类,主窗体只管基类就行,不过问其他细节