0

我正在构建一个简单的连接器组件,具有以下职责:

  1. 打开、保持和管理与外部服务的连接(即在后台运行)。
  2. 将传入的数据解析为逻辑消息,并将这些消息传递给业务逻辑组件。
  3. 将逻辑消息从业务逻辑发送到外部服务。

我不确定如何设计连接器的接口。

变体 A) 入站通道,出站消息的函数调用

// Listen for inbound messages.
// Inbound messages are delivered to the provided channel.
func Listen(msg chan *Message) {...}

// Deliver msg to service
func Send(msg *Message) {...}

变体 B) 入站和出站消息的通道

// Listen for inbound messages + send outbound messages.
// Inbound messages are delivered to the provided msgIn channel.
// To send a message, put a message into the msgOut channel. 
func ListenAndSend(msgIn chan *Message, msgOut chan *Message) {...}

变体 B 对我来说似乎更干净,更“像”,但我正在寻找以下问题的答案:

  • 有没有一种“惯用的”方式来做到这一点?
  • 或者,在哪些情况下应该首选变体 A 或 B?
  • 此类问题还有其他值得注意的变体吗?
4

1 回答 1

3

两种方法都只允许一个听众(除非您跟踪听众的数量,这是一种有点脆弱的方法),这是一个限制。这完全取决于您的编程偏好,但我可能会使用回调传入消息和发送方法:

func OnReceive(func(*Message) bool) // If callback returns false, unregister it.

func Send(*Message)

除此之外,您提出的两个模型都是完全有效的。第二个似乎更“正交”。使用发送方法的一个优点是您可以确保它永远不会阻塞,而不是“裸”通道。

于 2013-08-28T16:02:16.090 回答