iikoFront API SDK

Добавлена возможность взаимодействия между плагинами

[ ]

Начиная с версии 6.2 плагин, реализующий некую функцию, может зарегистрировать её в API как внешнюю операцию, чтобы другие плагины могли вызывать эту функцию.

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

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

Поскольку порядок запуска плагинов недетерминирован, возможна ситуация, что плагин-клиент уже запущен, а плагин-сервер ещё нет, соотственно, реализованные в нём внешние операции ещё не зарегистрированы в API. Следить за регистрацией/удалением внешних операций можно, подписавшись на PluginContext.Notifications.ExternalOperationChanged. Кроме того, через PluginContext.Operations.GetExternalOperations в любой момент можно запросить список доступных сервисов и их операций.

Роль API при вызове внешних операций ограничивается передачей запроса от плагина-клиента к плагину-серверу и передачей ответа в обратном направлении после завершения операции. Разработчики плагинов должны между собой договориться, как в передаваемых данных будут кодироваться ошибки, как обеспечить версионность и так далее. В базовом варианте запрос и ответ передаются в виде массивов байт, которые взаимодействующие стороны интерпретируют заранее оговорённым образом. Дабы избавить разработчиков от необходимости сериализации и десериализации данных в простейших случаях, в OperationServiceExtensions добавлены вспомогательные методы RegisterExternalOperation<TRequest, TResponse> и CallExternalOperation<TRequest, TResponse>, позволяющие передавать в качестве запроса и ответа (TRequest и TResponse) произвольные сериализуемые типы. В тривиальном случае, когда надо передать единственное значение общедоступного типа, можно непосредственно указать, допустим, int или string. Если нужно передать несколько значений, можно использовать кортежи (value tuples). Для передачи сложных объектов разработчик плагина-сервера может создать отдельную библиотеку с набором DTO-классов, помеченных атрибутом Serializable, использовать эту библиотеку самому в плагине-сервере, а также опубликовать её для разработчиков плагинов-клиентов. Примеры использования можно посмотреть в классе ExternalOperationsTester плагина Resto.Front.Api.SamplePlugin из SDK.

Пока новая функциональность доступна только в API V6, но с появлением новых версий (V7+) ожидается, что плагины, работающие на одной версии API, смогут вызывать функции плагинов, работающих на другой версии API. Взаимодействие доступно только в пределах одного экземпляра приложения iikoFront, то есть плагин, запущенный на одном компьютере, не может через API обращаться к плагину, работающему на другом компьютере.