【发布时间】:2021-09-12 19:28:23
【问题描述】:
我正在尝试生成此结构的 .proto:
-- 模型 --
基础模型
[DataContract]
public abstract class Base
{
[ProtoMember(1)]
public string Id { get; set; }
[ProtoMember(2, DataFormat = DataFormat.WellKnown)]
public DateTime CreatedDate { get; private set; } = DateTime.UtcNow;
[ProtoMember(3, DataFormat = DataFormat.WellKnown)]
public DateTime UpdatedDate { get; set; } = DateTime.UtcNow;
}
待办事项模型
[ProtoContract]
public class Todo : Base
{
[ProtoMember(1)]
public string Title { get; set; }
[ProtoMember(2)]
public string Content { get; set; }
[ProtoMember(3)]
public string Category { get; set; }
}
加上这一行:
RuntimeTypeModel.Default[typeof(Base)].AddSubType(42, typeof(Todo));
-- 合同 --
基础合同
[ServiceContract]
public interface IBaseService<T>
{
// CREATE
[OperationContract]
Task<RStatus> CreateOneAsync(T request,CallContext context = default);
// FIND
[OperationContract]
ValueTask<T> GetById(UniqueIdentification request,CallContext context = default);
}
待办事项合约
[ServiceContract]
public interface ITodoService : IBaseService<Todo>
{
// FIND
[OperationContract]
ValueTask<Todo> GetOneByQueryAsync(Query query, CallContext context = default);
}
通过这种通用方法,我试图防止重复代码。
-- Startup.cs --
...
endpoints.MapGrpcService<TodoService>();
endpoints.MapCodeFirstGrpcReflectionService();
...
所以,当我运行这个时:
var schema = generator.GetSchema<ITodoService>();
我在 .proto 文件中得到这个输出:
syntax = "proto3";
package Nnet.Contracts;
import "google/protobuf/timestamp.proto";
message Base {
string Id = 1;
.google.protobuf.Timestamp CreatedDate = 2;
.google.protobuf.Timestamp UpdatedDate = 3;
oneof subtype {
Todo Todo = 42;
}
}
message IEnumerable_Todo {
repeated Base items = 1;
}
message Query {
string Filter = 1;
}
message Todo {
string Title = 1;
string Content = 2;
string Category = 3;
}
service TodoService {
rpc GetOneByQuery (Query) returns (Base);
}
在 .proto 文件部分 service Todoservice 中,我缺少 Base 合约中的其他两个函数。还有,函数rpc GetOneByQuery (Query) returns (Base);的返回类型不对,应该是Todo。
有什么建议吗?
【问题讨论】:
标签: protobuf-net protobuf-net.grpc