您可以抽象消息反序列化。有一个“MessageHolder”类,最初只有对象的缓冲区。它会有一个方法:
IMessageInterface NarrowToInterface(MessageId id);
我不清楚您的路由器是否已经知道它是什么类型的消息。如果是这样,那么它将接收消息持有者实例并在其上调用 NarrowToInterface 方法。
它将传递适当类型的 id。如果路由器不知道它是什么类型,那么您在 MessageHolder 对象上也有一个属性:
MessageId GetMessageType();
路由器将使用它来了解它是什么消息类型来决定将它路由到哪里。更多关于稍后如何实施的信息。
IMessageInterface 是一个抽象类或接口,消息的接收者将向下转换为适当的类型,因为它知道期望什么类型。如果所有不同的消息都是众所周知的,并且您有可用的泛型或模板,则可以将 NarrowToInterface 方法作为模板方法,将返回值作为模板参数,这样您就有更好的类型安全性。如果您没有模板,您可以使用“Vistor”模式的双分派技术。谷歌“双重派遣访客”了解更多信息。
如果消息的类型没有明确定义或将来可能会增长,那么您将不得不在某个时候忍受(编译器无法验证)向下转换。据我所知,我建议的实现尽可能地封装了这一点,并将耦合限制在绝对最小值。
此外,为了使您的消息正常工作,您的消息必须在标头中使用标准标识符框起来。即有一个标准头,它具有整个消息的长度以及消息类型的 ID。这样,套接字端点可以解析消息的基础并将其放入消息持有者中。MessageHolder 可以知道所有不同的消息类型本身以实现 NarrowToInterface() 方法,或者可能有一个全局存储库将返回“IMessageDeserializer”对象以实现每个消息类型的 NarrowToInterface。所有已加载的消息客户端都将为它们支持的所有消息注册所有反序列化程序到存储库,并且还向消息路由器注册他们想要的消息类型 ID。