Межмодульная коммуникация в расширяемых приложениях?

Привет. Подтолкните пожалуйста в нужном направлениии! Есть абстрактное понимание вопроса, но нет желания писать очередной велосипед, т.к. наверняка есть какие-то продуманные стандарты или фреймворки, которые у меня не получается найти.

Цель:
Затея такого плана. Есть хост приложение, которое подгружает заданные модули приводя конечное приложение к итоговому виду.
Пример: Модуль обрабатывающий данные температуры, модуль обрабатывающий данные давления и модуль коммуникации, через который осуществляется связь с внешним миром(пусть будет TCP сервер).
Т.е. на выходе получается допустим метео сервер, с которого пользователь может забрать какие-то данные. По итогу приложение за счет модулей может стать начиная от калькулятора, заканчивая центром управления полетами.

Вопросы:
1. Каким образом я могу осуществить коммуникацию между модулями, что бы она была бессвязная. Допустим клиент отправляет запрос на получение значения температуры, модуль сервера получив этот запрос, должен как-то передать его допустим в модуль обработки запроса, который в свою очередь обратится, к запрашеваемому модулю температуры для получения значения и т.д.
Слышал про системы сообщений, RPC.

2. Подскажите по актуальным фреймворкам в освящаемой выше области, которые могут мне помочь и про котоые я могу хотя бы почитать, что-бы углубить свое понимание вопроса.

Большое спасибо!

5ce17d9cd1c53016957860.jpeg
  • Вопрос задан
  • 147 просмотров
Решения вопроса 1
@Deenovi Автор вопроса
Попрбую конкретизировать, меня интересует взаимодействие между модулями в самом приложении.

Есть приложение(ядро/хост), которое подгружает модули(.dll), в которых описана различная логика. Эти модули разумеется как либо нуждаются в функционале друг друга.

Т.е. если я делал бы монолитное приложение, я бы явно взял необходимые функции из библиотек и как-то использовал их.

В нынешнем случае такой подход не подходит, т.к. ядро должно динамически погружать модули, о которых оно ни чего не знает. Т.е. нужно абстрагироваться интерфейсами, например через паттерн посредник, либо делать какую-то систему сообщений, на которую будут реагировать другие модули и как-то отвечать. Вот тут у меня и начинается непонимание в связи с нехваткой знаний, как это все связать воедино и реализовать.

Т.е. как мне допустим из модуля UI, нажав на кнопку, повлиять на другой модуль, когда связи между ними неявные. Когда я не могу тупо инстанцировать модуль А, в модуле Б и вызвать какую-то функцию.

Если непонятно написал, попробую еще :)

------------------------------------------------------

В общем то решение посредством MEF нашлось. Думал, что фреймворк сам залинкует все связи между всеми модулями, где есть необходимые контракты, но линкует он только между хостом и модулями где выполняется композиция. Решил проблему повторным поиском необходимых контрактов в плагинах, которым нужны свои расширения, и очередной композицией уже в самом плагине. Т.е. плагин выступает так-же мини хостом для своих расширений. Если будут какие-то поправки или идеи, буду рад вас выслушать, Всем большое спасибо! :)

PS: Произошла магия и все стало линковаться как мне надо без танцев с бубном. Чудеса...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
OnYourLips
@OnYourLips
Судя по задаче, тут три несвязные области.

Первое - это коммуникация между приложениями на полноценных устройствах. Обычно это REST API и бекенд-фреймворки общего назначения.
Второе - коммуникация внутри сложной системы. Это очереди, например RabbitMQ.
Третья - общение полноценных устройств и "умных". Например, MQTT.

Чтобы понять. как вам помочь, хотелось бы видеть более конкретизированный вопрос. Сейчас ваша проблема не понятна.
Ответ написан
@d-stream
Готовые решения - не подаю, но...
Ближе всего это можно обозвать плагинами.
В .net есть замечательная штука mef
А для общего случая - ну видимо стоит сформировать некий минишаблон взаимодействия уровня загрузки этих самых плагинов, передачи им минимума параметров и передачи управления.

Более гибкое взаимодействие - ну или свою очередь или готовые реализации.
Ответ написан
@ddd329
Нее, интеграция посредством СООБЩЕНИЙ штука не такая простая, она в основном требуется в больших корпоративных приложениях, когда существует множество приложений, между которыми необходимо настроить взаимодействие.
В Вашем случае все намного проще для того, чтобы разбить монолит на отдельные модули. Есть такой паттерн как "Plugin", который описан в книге Фаулера по шаблонам корпоративных приложений.
Я бы сделал так: создал отдельный проект, где приведены контракты модулей, т.е. программные интерфейсы. Ну а далее в других проектах идет реализация этих контрактов/интерфейсов...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы