【发布时间】:2020-11-27 09:13:24
【问题描述】:
我正在使用 C# 中的 gRPC 启动一个小型示例项目,当我实现 proto 文件时,当我键入相同名称的函数但不同的参数时会出现一些错误。
我可以在 proto 文件中重载函数吗?
【问题讨论】:
我正在使用 C# 中的 gRPC 启动一个小型示例项目,当我实现 proto 文件时,当我键入相同名称的函数但不同的参数时会出现一些错误。
我可以在 proto 文件中重载函数吗?
【问题讨论】:
不,protobuf 中服务中的 RPC 名称必须是唯一的。
实现有点像重载的最简单方法是使用单一请求类型和单一响应类型,但在顶层使用oneof 来指定一个“子请求”或“子响应”。然后,您可以非常轻松地在 C# 代码中创建另一个部分类并在其中编写重载,这基本上从子请求消息中适当地创建请求,然后提取适当的子响应。
或者,如果您的 RPC 真的只想做一件事,而您只是想让以不同的方式调用更容易(这是最合适的重载形式),那么您可以只是 em> 添加部分类。例如,如果您有这样的服务:
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)
{
...
}
}
...那么您可以像这样编写自己的部分类:
public partial class MathClient
{
public int Add(int x, int y)
{
var request = new AddRequest { X = x, Y = y };
var response = Add(request);
return response.Result;
}
// Similarly for async
}
【讨论】: