Вы можете абстрагировать десериализацию сообщения. Иметь класс «MessageHolder», который изначально имеет буфер для объекта. Это будет иметь метод:
IMessageInterface NarrowToInterface (идентификатор сообщения);
Мне не было ясно, узнает ли ваш маршрутизатор, что это за сообщение или нет. Если это произойдет, то он получит экземпляр держателя сообщения и вызовет для него метод NarrowToInterface.
Это передало бы идентификатор соответствующего типа. Если маршрутизатор не знает, какой это был тип, у вас также будет свойство для объекта MessageHolder:
MessageId GetMessageType ();
что маршрутизатор будет использовать для определения типа сообщения, чтобы решить, куда его направить. Подробнее о том, как это реализовано позже.
IMessageInterface - это абстрактный класс или интерфейс, который получатель сообщения будет преобразовывать в соответствующий тип, поскольку он будет знать, какой тип ожидать. Если все различные сообщения хорошо известны и у вас есть универсальные шаблоны или шаблоны, вы можете использовать метод NarrowToInterface как метод шаблона, который принимает возвращаемое значение в качестве параметра шаблона, чтобы обеспечить лучшую безопасность типов. Если у вас нет шаблонов, вы можете использовать технику двойной отправки шаблона «Vistor». Google "двойная рассылка посетитель" для получения дополнительной информации.
Если типы сообщений не определены четко или могут вырасти в будущем, вам просто придется смириться с (не проверяемым компилятором) понижением в какой-то момент. Насколько я знаю, реализация, которую я предлагаю, инкапсулирует это в максимально возможной степени и ограничивает связь до абсолютного минимума.
Кроме того, чтобы это работало, ваши сообщения должны быть снабжены стандартным идентификатором в заголовке. то есть существует стандартный заголовок, который имеет длину всего сообщения, а также идентификатор типа сообщения. Таким образом, конечная точка сокета может проанализировать основы сообщения и поместить его в держатель сообщения. MessageHolder может либо сам знать обо всех различных типах сообщений для реализации метода NarrowToInterface (), либо может существовать глобальное хранилище, которое будет возвращать объекты IMessageDeserializer для реализации NarrowToInterface для каждого типа сообщения. Все загруженные клиенты сообщений регистрируют все десериализаторы для всех сообщений, которые они поддерживают в репозитории, а также регистрируют идентификаторы типов сообщений, которые они хотят, в маршрутизаторе сообщений.