经过深思熟虑、原型设计和研究,我终于使用事件和代表实现了该解决方案,并且运行良好!
唯一的主要设计问题是,例如,如果 3 个分发节点连接成三角形,则消息将进入无限循环的情况。或者如果一个节点连接到自身或两个节点多次相互连接。我在事件侦听器连接中用一些简单的逻辑覆盖了这些边缘案例中的每一个:
public bool ConnectTo(Node peerNode)
{
EthernetPort peerPort = peerNode.GetFreePort();
EthernetPort myPort = this.GetFreePort();
// Perform a check for free ports for both peers:
if (peerPort == null || myPort == null)
return false; // Either myself or my peer do not have a spare port.
// Perform a check to make sure these nodes aren't already connected:
if (this.HasConnectedNode(peerNode))
return false;
// Connect the two ports:
myPort.Connect(peerNode, peerPort);
peerPort.Connect(this, myPort);
return true;
}
public bool HasConnectedNode(Node node) {
foreach (var port in ethernetSwitch.ethernetPorts)
{
if (port.peerNode == node)
return true; // Found a port already connected to this node.
}
return false; // No port has this node connected to it.
}
最后,以防万一我错过了什么或者只是为了安全起见,我实现了一个EventArgs
带有int timeToLive
变量的自定义类型。每次节点处理消息时,此变量都会递减,如果达到 0,则丢弃该消息。