gRPC函数是否有可能重载?
c#
我正在用 C# 中的 gRPC 开始一个小示例项目,当我实现 proto 文件时,当我输入相同名称的函数但不同的参数时,我会收到一些错误。
我可以在 proto 文件中重载函数吗?
回答
不,protobuf 中服务中 RPC 的名称必须是唯一的。
实现类似重载的最简单方法是拥有单一请求类型和单一响应类型,但oneof在顶层使用 a来指定一个“子请求”或“子响应”。然后,您可以非常轻松地在 C# 代码中创建另一个部分类并在其中编写重载,这基本上从子请求消息中适当地创建请求,然后提取适当的子响应。
或者,如果您的 RPC 真的只想做一件事,而您只是想让以不同的方式调用更容易(这是最合适的重载形式),那么您可以只添加部分类。例如,如果您有这样的服务:
service Math {
rpc Add (AddRequest) returns (AddResponse) {}
}
message AddRequest {
int32 x = 1;
int32 y = 2;
}
message AddResponse {
int32 result;
}
service Math {
rpc Add (AddRequest) returns (AddResponse) {}
}
message AddRequest {
int32 x = 1;
int32 y = 2;
}
message AddResponse {
int32 result;
}
...然后如果生成的代码看起来像这样:
...然后你可以像这样编写自己的部分类:
public partial class MathClient
{
public virtual AddResponse Add(AddRequest request, CallOptions options)
{
...
}
public virtual AsyncUnaryCall<AddResponse> AddAsync(AddRequest request,
headers = null, DateTime? deadline = null,
CancellationToken cancellationToken = default)
{
...
}
public virtual AsyncUnaryCall<AddResponse> AddAsync(
AddRequest request, CallOptions options)
{
...
}
}