Я хочу разделить модули моей программы на общение друг с другом. Они могут находиться на одном компьютере, но, возможно, на разных.
Я рассматривал 2 метода:
Итак, это сводится к хеш-таблице и классу.
Если я думаю, что "слабо связан", я выступаю за хэш-таблицу. Легко обновить один модуль, включить новые дополнительные параметры в hastable, не обновляя другую сторону.
Затем снова с классом я получаю проверку типа компиляции, а не время выполнения.
Кто-нибудь занимался этим раньше и имеет предложения об этом?
Спасибо!
изменить: Я получил баллы за ответ, который был наиболее важен для моего первоначального вопроса, хотя это не тот, который был поддержан наиболее
Как правило, этот вопрос возникает в дизайне распределенных систем. Он отображается в веб-службе (WSDL, определяющий параметры и типы возврата). Системы обмена сообщениями, в которых форматы сообщений могут быть XML или каким-либо другим четко определенным форматом. Проблема управления связью клиента и сервера остается во всех случаях.
Что происходит с вашей хэш-таблицей? Предположим, что ваш запрос содержит "NAME" и "PHONE-NUMBER", и вдруг вы осознаете, что вам нужно различать "LANDLINE-NUMBER" и "CELL-NUMBER". Если вы просто измените записи хэш-таблицы, чтобы использовать новые значения, тогда ваш сервер должен измениться в одно и то же время. Предположим, на данный момент у вас есть не только один клиент и один сервер, но, возможно, имеет дело с каким-то обменным или брокерским системами, многие клиенты реализованы многими командами, многие серверы реализованы многими командами. Просить всех из них перейти на новый формат сообщения в то же время - это довольно серьезная задача.
Следовательно, мы стремимся искать обратно-доступные решения, такие как добавление, мы сохраняем "PHONE-NUMBER" и добавляем новые поля. Теперь сервер переносит сообщения, содержащие старый или новый формат.
Различные технологии распространения имеют разные встроенные степени терпимости для обратной совместимости. Когда вы имеете дело с сериализованными классами, вы можете иметь дело со старыми и новыми версиями? Когда вы работаете с WSDL, будут ли парсеры сообщений допускать аддитивные изменения.
Я бы выполнил следующий процесс:
1). Будете ли вы иметь простую связь между клиентом и сервером, например, вы кодируете и управляете обоими, свободно диктовать свои циклы выпуска. Если "нет", то предпочитайте гибкость, используйте хэш-таблицы или XML.
2). Даже если вы контролируете, как легко ваша среда для сериализации поддерживает управление версиями. Скорее всего, с ним будет работать более сложный интерфейс с сериализованным классом, и вы сможете получить четкое представление о том, что он предпримет, чтобы внести изменения в интерфейс.
Похоже, вы просто хотите включить в свою систему IPC (Inter-Process Communication).
Лучший способ выполнить это в .NET(начиная с версии 3.0) - с Windows Communication Foundation (WCF) - разработана общая структура Microsoft для связи между программами различными способами (транспортом) на общей основе.
Хотя я подозреваю, что вы, вероятно, захотите использовать именованные каналы в целях повышения эффективности и надежности, существует целый ряд других транспортных средств, таких как TCP и HTTP (см. в этой статье MSDN), не говоря уже о различных форматах сериализации от двоичного до XML в JSON.
Что случилось со встроенной поддержкой Remoting?
http://msdn.microsoft.com/en-us/library/aa185916.aspx
Он работает на TCP/IP или IPC, если вы хотите. Это быстрее, чем WCF, и довольно прозрачно для вашего кода.
Вы можете использовать Sockets, Remoting или WCF, у eash есть плюсы и минусы.
Но если производительность не имеет решающего значения, вы можете использовать WCF и сериализовать и десериализовать свои классы, а для максимальной производительности я рекомендую сокеты
В нашем опыте с использованием WCF в течение последних нескольких лет с различными связями мы обнаружили, что WCF не стоит проблем.
Просто сложно правильно использовать WCF, в том числе правильно обрабатывать ошибки на каналах, сохраняя при этом хорошую производительность (мы отказались от высокой производительности с помощью wcf на ранней стадии).
Для аутентифицированных клиентских сценариев мы переключились на http rest (без wcf) и выполнили полезную нагрузку json/protobuf.
Для высокоскоростных сценариев, не прошедших проверку подлинности (или, по крайней мере, не связанных с Kerberos сценариев), мы теперь используем zeromq и protobuf.