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 文件
我在 .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 文件