【问题标题】:C# GRPC - without dependencies [closed]C# GRPC - 没有依赖项 [关闭]
【发布时间】:2019-01-20 14:12:42
【问题描述】:

我们在一个项目中广泛使用 GRPC,使用 Grpc.Tools 包从 .proto 定义文件生成 .Net 客户端。然而,我们很头疼的是,生成的代码与 GRPC 耦合非常紧密——它具有 GRPC 特定的属性、GRPC 特定的接口等等。

我追求的是一种在 C#/.Net 中生成“干净”接口的方法,即用于描述服务和消息的普通 C# 类型和接口,无需携带所有 GRPC 内容即可廉价引用。

是否有任何现有的库/工具可供您使用?或者我可以查看的任何示例项目巧妙地处理了这个问题?或者也许是自定义 GRPC 工具以从中提取我想要的东西的示例?

【问题讨论】:

    标签: c# .net code-generation grpc


    【解决方案1】:

    这里有几件事要知道:

    • gRPC C# 本身与序列化格式无关(= 您可以使用任何您想要的序列化格式),但由于没有序列化格式,可用性受到限制,因此默认选择支持 Google 协议缓冲区。 Grpc.Tools 包提供了协议缓冲区编译器插件,它生成要与 Protobuf + gRPC 一起使用的服务存根(所以你提到的“紧密耦合”是有意的)。

    • 如果您想使用自己的序列化格式,您基本上需要编写自己的代码生成器(并且 gRPC C# API 的设计方式可以做到这一点),它将生成看起来像你想要的方式。事实上,如果您检查 Grpc.Core nuget 包(gRPC C# 的主要功能),您会发现它对 Google.Protobuf 没有任何依赖,这允许您使用选择的序列化格式。请注意,这是一个非常高级的概念,除非您知道自己在做什么,否则我强烈建议您只使用默认选项(即带有 prototobuf 的 gRPC,使用标准代码生成)。

    • 有些项目已经成功地为不同的序列化格式实现了自定义代码生成,例如 Apache Thrift、Flatbuffers、Microsoft Bond 等。您可以检查他们的代码以了解如何编写自定义代码生成(也有几篇博文围绕这个话题)。

    【讨论】:

    • 我的意思是,我想要不从某些框架类型继承的消息类,以及一个我可以使用的合理接口......这样的实现细节应该远离代码库的其余部分,而默认工具生成的代码对此无济于事。
    • RichardW1001,提供生成的接口对于向后兼容性是有问题的 - 如果您在 .proto 文件中的服务定义中添加新方法(随着服务的发展,这很常见),这将生成一个与其中有一个额外的方法,该接口的所有实现都会中断。相反,grpc codegen 会生成一个带有默认方法实现的抽象类,从而避免了这个问题(重新生成后,一切仍然正常)。
    【解决方案2】:

    目前,没有这样的库。连 protobuf.net 都不兼容 grpc (Using ProtoBuf-net with gRPC)

    我追求的是一种在 C#/.Net 中生成“干净”接口的方法, 即简单的 C# 类型和接口来描述服务和 消息,可以便宜地引用而无需携带所有 GRPC 的东西。

    这就是grpc最显着的优势,基于proto文件的代码可以多语言生成。我同意你的观点,生成的代码看起来会更好,并且应该为客户端/服务器/消息创建接口。

    如果您不想使用生成的代码,那么您可以创建自定义客户端实现,其他部分(服务器、消息)必须从生成的代码中使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-23
      • 2018-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 2014-08-20
      相关资源
      最近更新 更多