Локатор сервисов (Service Locator)

Локатор сервисов — небольшая библиотека, которая позволяет:

Значения IPC-дескриптора и RIID необходимы для обращения к конкретному интерфейсу конкретной серверной сущности. Эти значения используются при инициализации транспорта.

Чтобы использовать локатор сервисов, нужно в коде сущности подключить файл sl_api.h:

#include <coresrv/sl/sl_api.h>

Основные функции локатора сервисов

Функции, используемые на клиентской стороне:

Имя соединения указывается в файле init.yaml, имя экземпляра компонента – в EDL-файле, а имя реализации интерфейса – в CDL-файле.

Функции, используемые на серверной стороне:

Пример использования локатора сервисов

Рассмотрим следующее решение, содержащее две сущности — Client и Server.

Клиентская сущность не реализует ни одного интерфейса.

Client.edl

entity Client

Серверная сущность содержит экземпляр компонента Ping. Имя экземпляра: ping_comp.

Server.edl

entity Server

components {

ping_comp: Ping

}

Пусть компонент Ping содержит именованную реализацию интерфейса Ping, объявленного в файле Ping.idl. Имя реализации: ping_impl.

Ping.cdl

component Ping

interfaces {

ping_impl: Ping

}

(Для краткости файл Ping.idl не приведен.)

В init-описании укажем, что сущности Client и Server должны быть соединены каналом с именем server_connection:

init.yaml

entities:

- name: Client

connections:

- target: Server

id: server_connection

- name: Server

Использование локатора сервисов на стороне клиента:

client.c

/* Подключаем локатор сервисов */

#include <coresrv/sl/sl_api.h>

/* Получаем клиентский IPC-дескриптор канала "server_connection" */

Handle handle = ServiceLocatorConnect("server_connection");

/* Получаем идентификатор (RIID) реализации ping_impl, содержащейся в экземпляре ping_comp */

nk_iid_t riid = ServiceLocatorGetRiid(handle, "ping_comp.ping_impl");

Использование локатора сервисов на стороне сервера:

server.c

/* Подключаем локатор сервисов */

#include <coresrv/sl/sl_api.h>

nk_iid_t iid;

/* Получаем серверный IPC-дескриптор канала "server_connection" */

Handle handle = ServiceLocatorRegister("server_connection", NULL, 0, &iid);

В начало