GRPC 从数据库发送模型

GRPC send model from database

我在 .NET Core 5.0 中使用 Scaffolding 从数据库 table 创建了一个模型:

Scaffold-DbContext "Server=XXX;Database=XXX;User ID=XXX;Password=XXX;" Microsoft.EntityFrameworkCore.SqlServer -Tables SomeTable

SomeTable.cs

public partial class SomeTable
    {
        public Guid Uid { get; set; }
        public Guid? TypeUid { get; set; }
        public string Sender { get; set; }
        public DateTime? DateSent { get; set; }
        public bool IsSend { get; set; }
        public Guid? RefUid { get; set; }
    }

some.proto

syntax = "proto3";

option csharp_namespace = "Test.Services";
import "google/protobuf/timestamp.proto";
import "google/protobuf/wrappers.proto";

package some;

service SomeService {
  rpc GetSome (SomeRequest) returns (SomeReply);
}

message SomeRequest {
  int32 Count = 1;
}

message SomeToSent {
  string Uid = 1;
  google.protobuf.StringValue TypeUid = 2;
  google.protobuf.StringValueSender = 3;
  google.protobuf.Timestamp DateSent = 4;
  bool IsSend = 5;
  google.protobuf.StringValue RefUid = 6;
  
}

message SomeReply {
  int32 Count = 1;
  repeated SomeToSent Some = 2;
}

但我不清楚如何通过GRPC发送它,因为如果我覆盖rpc GetSome,那么我需要发送一个重复的SomeToSent(和Count).但我不想将 SomeTable 映射到 SomeToSent。我只想发送 SomeTable 个对象的列表。

具体问题定义

如何在不映射到原型模型的情况下通过 GRPC 正确发送数据库对象?

P.S.

昨天,我创建了 REST Api,其中 returns 一些 SomeTable 行采用 JSON 格式。此外,我还通过 GRPC 提供了 returns 这些行的服务。如果按速度比较它们,结果几乎相同。但我花了更多时间在手动对象映射上。我读过的每篇文章都告诉我,如果 REST 中出现 CRUD,我必须尝试使用​​ GRPC 而不是 REST。但我真的看不出有什么区别。我画了一个非常近似的经过时间图(10000 行):

此图表基于调试信息。而且我仍然认为这种映射会减慢服务响应速度。如有不妥请指正

IIUC 你必须 在原型和生成的数据库之间映射 table 类:

  • gRPC 只能通过网络传输适当格式的对象;
  • 数据库需要适当格式的对象来持久化|检索。

这种抽象的一个好处是,如果您更改数据库 table 模式,您只需要修改映射,而不必更改原型消息,反之亦然。

另一个好处是,如果您添加不同的来源和汇集您的解决方案,您可以考虑使用例如原始消息作为通用格式。然后您只需要编写 n+m 映射而不是 n*m。

您可能希望考虑包含重复 SomeToSent 消息的消息和|或定义 rpc 流式传输消息。

如果您仅保留 IMessages?,这样客户端将进行反序列化,而服务器仅发送消息。例如,Protobuffer

的 git 中的 BoockMessage 文件