Добавлена возможность взаимодействия между плагинами
[ ]Начиная с версии 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 обращаться к плагину, работающему на другом компьютере.