Как реализовать функции в определении услуг Bond?

Глядя на документацию Bond Comm, мне не было ясно, как функции, которые я определяю для сервисов, связаны с конкретными функциями в моем коде.

Ищет ли он функцию с такой же сигнатурой в проекте и назначает ее конечной точке? Есть ли какой-то основной файл настроек, который мне не хватает?

1 ответ

Решение

NB: Bond Comm устарела. Он больше не поддерживается и будет удален из Bond в следующем выпуске. Bond-over-gRPC является его заменой.

При использовании Bond-over-gRPC или Bond Comm сгенерированный серверный код является абстрактным классом с абстрактным методом для каждого метода в определении сервиса. Чтобы обеспечить свою логику для этих методов, вы наследуете от сгенерированной базы и предоставляете реализации для всех методов обслуживания. Затем, обычно в вашей основной функции, вы создаете сервер (для Bond-over-gRPC) или прослушиватель (для Bond Comm) и регистрируете экземпляр класса реализации. Это устанавливает маршрутизацию для метода сервиса IDL к вашему коду реализации.

Из документации Bond-over-gRPC C#:

Дано определение сервиса, подобное следующему:

service Example
{
    ExampleResponse ExampleMethod(ExampleRequest);
}

gbc сгенерирует классы C# для gRPC с флагом --grpc:

gbc c# --grpc example.bond

...

Чтобы создать функциональность службы, просто напишите конкретную реализацию службы, выделив подклассы серверной базы и предоставив бизнес-логику:

public class ExampleServiceImpl : Example.ExampleBase {
    public override async Task<IMessage<ExampleResponse>>
        ExampleMethod(
            IMessage<ExampleRequest> param,
            ServerCallContext context)
    {
        ExampleRequest request = param.Payload.Deserialize();
        var response = new ExampleResponse();

        // Service business logic goes here

        return Message.From(response);
    }
}

Эта реализация сервиса подключается к серверу gRPC следующим образом:

var server = new Grpc.Core.Server {
    Services = { Example.BindService(new ExampleServiceImpl()) },
    Ports = { new Grpc.Core.ServerPort(ExampleHost, ExamplePort, Grpc.Core.ServerCredentials.Insecure) } };
server.Start();

На этом этапе сервер готов принимать запросы и направлять их на реализацию сервиса.

Есть и другие примеры:

Стоит отметить, что (Bond-over-) gRPC и Bond Comm не являются ни SOAP, ни REST. Вопрос был помечен веб-сервисом, и иногда люди имеют в виду SOAP/REST, когда говорят о веб-сервисах. Я думаю о gRPC и Bond Comm как о пользовательских двоичных протоколах через TCP, хотя gRPC выполняется поверх HTTP/2.

Другие вопросы по тегам