我正在指定一些独立的 gRPC 服务,这些服务都将在同一服务器进程中托管。每个服务都在自己的protobuf文件中定义。然后通过 gRPC 工具运行这些工具,为我提供目标语言(在我的情况下为c#),然后我可以在其中实现我的服务器和客户端。
每个单独的API都使用了许多常见元素,例如错误响应枚举, Empty 消息类型(似乎可以在 gRPC WellKnownTypes ;但是我无法看到我是如何包含它的,所以我定义了自己的。)
目前,我最终将每个proto构建重复的枚举和类放入他们自己的命名空间。虽然我知道我可以在一个共同的原型文件中共享这些定义并包含它;我不知道如何只将这些代码生成一个共同的命名空间。虽然这是有效的,但将它保持在一组是最整洁的;如果在服务中聚合错误等事情,它在转换和等效性方面也可能会出现问题。
我认为我遗漏了一些内容,因为我对 WellKnownTypes 命名空间等内容的阅读表明这应该是可行的,但如前所述,我不知道我是如何在Proto要么。
目前在 gRPC 上看起来很轻松,所以我的搜索量并没有太大,我是新手,所以任何指针?
答案 0 :(得分:9)
协议缓冲区通过使用不同的package
标识符来解决此问题。每条消息都将放在一个不同的协议缓冲区特定包中,该包独立于C#命名空间。例如:
// common.proto
syntax "proto3";
package my.api.common;
option csharp_namespace = "My.Api.Common";
message Shared {
// ...
}
然后在服务特定文件中:
// service1.proto
syntax "proto3";
package my.api.service1;
import "common.proto";
option csharp_namespace = "My.Api.Service1";
message Special {
my.api.common.Shared shared = 1;
}
您需要确保只有一个普通原型的副本,否则它们可能会失去同步。您可以将常用消息放在common.proto
文件中,并从每个特定的其他原型文件中引用它们。