查看Bond Comm 文档,我不清楚我为服务定义的函数是如何连接到我的代码中的特定函数的。
它是否在项目中寻找具有相同签名的函数并将其分配给端点?我缺少一些基础设置文件吗?
查看Bond Comm 文档,我不清楚我为服务定义的函数是如何连接到我的代码中的特定函数的。
它是否在项目中寻找具有相同签名的函数并将其分配给端点?我缺少一些基础设置文件吗?
注意:不推荐使用 Bond Comm。它不再受支持,并将在即将发布的版本中从 Bond 中删除。Bond-over-gRPC是它的替代品。
当使用 Bond-over-gRPC 或 Bond Comm 时,生成的服务器端代码是一个抽象类,服务定义中的每个方法都有一个抽象方法。为了为这些方法提供逻辑,您从生成的基础继承并为所有服务方法提供实现。然后,通常在您的 main 函数中,您创建一个服务器(用于 Bond-over-gRPC)或一个监听器(用于 Bond Comm)并注册一个实现类的实例。这会将 IDL 服务方法的路由设置到您的实现代码。
给定如下服务定义:
service Example { ExampleResponse ExampleMethod(ExampleRequest); }
gbc 将使用 --grpc 标志为 gRPC 生成 C# 类:
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。这个问题被标记为web-service,有时人们在谈论 Web 服务时指的是 SOAP/REST。我认为 gRPC 和 Bond Comm 都是基于 TCP 的自定义二进制协议,尽管 gRPC 运行在 HTTP/2 之上。