上下文
我正在编写一个与某些硬件通信的 C# 程序,一些通过直接串行链接,一些通过 TCP/IP 套接字。
串行和 TCP 套接字基本上是字节流,特别是如果您不处理硬件流控制等特定参数。
需要
常用代码:已解决
为了方便起见,我希望相同的代码能够通过简单的配置在串行和 TCP 流之间切换。
从软件设计的角度来看,这是在所有情况下获取一个公共(public)对象并仅在客户端代码中使用该对象的问题。在 C# 中,可以从以下位置获取 Stream
对象:
http
URL(引用 c# - Getting a Stream from an absolute path? - Stack Overflow)- 使用 SerialPort.BaseStream Property 的 SerialPort 实例
- 使用 TcpClient.GetStream, méthode (System.Net.Sockets) 的 TcpClient 实例
到目前为止一切顺利。
通过配置切换:缺少链接?
现在如何在配置中表示不同的情况? URI 会很好。
我知道 URI 不可移植,没关系,不同平台上的配置文件可能不同。
本次讨论Boost mailing page: Re: [boost] Re: [network] An RFC - updated提到 URL 如何表示此类流:
server.address=tcp4:/www.example.com:5757
server.address=com1:/57600,n,8,1
serial://com1?baud=115200
喜欢Serial Connection Problem on IF2 with advanced BR... - Intermec Community .
编辑:阅读RFC 2396 - Uniform Resource Identifiers (URI): Generic Syntax看起来下面的字符串会更一致:
serial://com1?baud=9600
serial:///dev/ttyS0?baud=9600
tcp://servernameorip:port
(结束编辑)
如果配置文件提及带有 tcp 或串行参数的 URI 并让代码实例化正确的具体类,那就太好了。在设计模式中,这称为工厂方法。
它会像这样使用:
Stream mystream1=MyFactoryClass.GetStream("com1:/57600,n,8,1");
Stream mystream2=MyFactoryClass.GetStream("tcp4:/www.example.com:5757");
我无法在 Internet 或文档中找到它。提到串行端口的 URI 似乎很少见,另一个例子:Using Network Printers - CUPS.org
问题
有谁知道这样的开源工厂类是否已经存在?
做起来并不长,但如果它已经存在,最好不要重新发明它。
最佳答案
它不存在,但我相信内置的 Uri
类支持自定义方案。
考虑像 .NET Framework 通常那样做。配置文件将指定类型名称和一些字符串参数。我认为这里不需要 URI。
关于c# - 从 URI 创建流对象(TCP、串行)的工厂方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25555619/