【问题标题】:Protobuff package vs option csharp_namespaceProtobuf 包与选项 csharp_namespace
【发布时间】:2022-08-10 16:36:20
【问题描述】:

我正在使用 Proto 3 和 C# 创建一个 gRPC 服务。

在 Protobuff 的 Google 开发人员指南中,它提到了 package

在 C# 中,包在转换为 PascalCase 后用作命名空间,除非您在 .proto 文件中明确提供选项 csharp_namespace。

所以我不确定packageoption csharp_namespace 之间有什么区别?如果我同时声明它们会发生什么?如果我声明其中一个,那么另一个是多余的吗?

    标签: protocol-buffers proto3 protocol-buffers-3


    【解决方案1】:

    包在 Protocol Buffers 中非常令人困惑,因为人们并不真正将 Protobuf 本身视为一种语言。 protobuf package 在您的情况下对生成很有用(当您没有定义 csharp_namespace 时),但这在您的 proto 文件中也很有用。

    如果你有:

    a.proto

    syntax = "proto3";
    
    package my_package;
    
    message A {}
    

    在一个文件中,然后将此文件导入另一个不使用该包的文件中,如下所示:

    b.proto

    syntax = "proto3";
    
    import "a.proto";
    
    message B {
      my_package.A a = 1;
    }
    

    您将需要指定完全限定名称 (my_package.A)。

    现在,对于option csharp_namespace。这将调整代码生成,以便 C# 代码中的命名空间是您作为值提供的命名空间。 所以,如果你同时定义了哪一个会占上风,它应该是选项之一,因为这是为了调整一代,package 更适合你的 protobuf 架构。

    【讨论】:

    • 在导入 a.proto 的示例中,如果 b.proto 确实定义了自己的不同包会发生什么?听起来应该保持不变?如果包与 a.proto 中的包相同怎么办?即使不导入,我也可以在 B 中使用来自 A 的消息吗?
    • 如果您有不同的包,您仍然必须使用完全限定名称 (my_package.A)。如果您定义相同的包,您仍然需要导入,但您可以删除 my_package. 部分
    【解决方案2】:

    包名将用于为生成的服务命名,该名称将用于生成 URL,在调用期间将调用该 URL 到远程过程。 例如

    syntax = "proto3";
    package gRPCDemo.v1;
    option csharp_namespace = "Branch.Sample.gRPC";
       service BranchService {
         rpc GetById (CountrySearchRequest) returns (CountryReply) {}
       }
    

    所以如果未设置包名称,则__ServiceName 属性将具有BranchService 的值。

    【讨论】:

      猜你喜欢
      • 2023-01-19
      • 1970-01-01
      • 1970-01-01
      • 2021-05-07
      • 2018-06-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多