.net 应用程序设计建议

.net 应用程序设计建议,.net,vb.net,winforms,tcp,.net,Vb.net,Winforms,Tcp,我正在为我目前正在开发的应用程序寻找一些建议。我会尽量保持这一点尽可能简短,所以如果需要更多的信息,请让我知道 我正在使用VB.Net(VS 2008 Pro)开发一个基于Winforms的事件跟踪系统。该应用程序通过串行条形码扫描仪收集数据,并将该数据存储在安装该应用程序的同一Windows XP Pro工作站上的MS SQL Express db中。当应用程序收到格式化的数据字符串时,它会检查db表,并向设备发送一个回复,指示数据是否重复。我已经编写了一个PortManager类来处理基于串

我正在为我目前正在开发的应用程序寻找一些建议。我会尽量保持这一点尽可能简短,所以如果需要更多的信息,请让我知道

我正在使用VB.Net(VS 2008 Pro)开发一个基于Winforms的事件跟踪系统。该应用程序通过串行条形码扫描仪收集数据,并将该数据存储在安装该应用程序的同一Windows XP Pro工作站上的MS SQL Express db中。当应用程序收到格式化的数据字符串时,它会检查db表,并向设备发送一个回复,指示数据是否重复。我已经编写了一个PortManager类来处理基于串行的设备,该功能运行良好

我现在被要求在系统中加入一种新型的采集设备。新设备运行嵌入式Linux,使用TCP\IP(POE)而不是串行通信。设备制造商向我保证,他可以从设备集成扫描仪提供与我的串行设备相同格式的字符串

如果可能的话,我想利用当前的应用程序,只添加使用TCP\IP设备的功能。我想也许可以添加一个新类(类似于我的端口管理器类)来处理基于TCP\IP的设备

我真的不知道最好的方法是什么。我只是不太熟悉使用基于TCP\IP的设备从Winforms应用程序收集数据

如果您对通过TCP\IP与Winforms应用程序通信的最佳方法和/或示例代码有任何建议,我们将不胜感激


感谢您可能提供的任何帮助

我能想到的最干净的方法是重构代码,以接受流作为输入。然后,您可以将端口管理器更改为写入应用程序提供的流。net中的TCP/IP通信最容易通过网络流处理,因此现在您有了一个干净的接口,以后可以进一步扩展,以包括平面文件流、来自其他应用程序/插件的内存流。

为输入创建一个简单的包装器对象。听起来,无论事件如何到达您的系统,您拥有的设备都会生成消息或事件

一个简单的接口应该是

public interface IBarcodeScanner 
{
  IEnumerable<BarcodeEvent> ReadEvents();
}

然后,您只需创建两种类型的IBarcodeScanner。串行端口版本和TCP/IP版本。作为额外的好处,您可以创建一个虚拟条形码扫描器,以便于测试代码。

如果您认为重构端口类太难,还有另一种选择。您可以创建一个单独的应用程序来执行串行端口操作,并在其中实现一个看起来非常类似于基于TCP/IP的设备的TCP/IP服务器

然后,您的应用程序更改为使用TCP/IP与扫描仪通信。扫描仪是通过串行端口进行通信的应用程序,还是使用TCP/IP直接进行通信的外部扫描仪,这无关紧要

同样,这使您能够通过实现一个简单的存根应用程序来创建虚拟扫描仪


这不是一个理想的方法,因为您必须创建两个应用程序,并确保TCP/IP到串行应用程序在需要时启动,但它会工作。

谢谢您的建议,克里斯,您的建议似乎是一个很好的解决方案。不过,我需要对重构做一些研究。。。我从未真正使用过它,这是我的第一个主要Winforms应用程序。我通常从事ASP和ASP.Net的工作。谢谢你,尼克!看来一旦我弄清楚了所有的东西都需要去哪里,它就很容易实现了。我喜欢虚拟条形码扫描仪的想法;那会帮我省去很多测试的麻烦。我不确定我是否能够使用我的port类,因为它正在处理实际的串行端口操作以及数据的读/写函数。你不会碰巧知道一个利用你的建议的简单应用程序示例吧?我为我的无知道歉,正如我向Chris提到的,我更多的是一个Web开发人员,这是我第一次不得不做这种类型的应用程序。再次感谢你,尼克!我没有一个简单的例子可以帮助你,但其他人可能会。至于使用端口类,这应该是可能的。问题是这个接口隐藏了所有的复杂性。你甚至可以执行一个单独的应用程序来做一些事情,使用stdin/stdout与之通信,然后从界面返回条形码事件。我真的希望避免创建两个不同的应用程序。我想我可以研究一下重构选项,看看我能用它做些什么。谢谢你,尼克。
var barcodeScanner = OpenConnectedScanner();
foreach (var barcodeEvent in barcodeScanner)
{
  ProcessEvent(barcodeEvent);
}