扩展 Protobuf 消息

Extending Protobuf Messages

我有许多不同的模式,但是每个模式都包含一组字段。我想知道是否有办法让不同的模式扩展父模式并继承其字段。例如,这就是我想要的:

message Parent {
    required string common1 = 0;
    optional string common2 = 1;
}

message Child1 { // can we extend the Parent?
    // I want common1, common2 to be fields here
    required int c1 = 2;
    required string c2 = 3;
}

message Child2 { // can we extend Parent?
    // I want common1, common2 to be fields here
    repeated int c3 = 2;
    repeated string c4 = 3;
}

这样 Child1 和 Child2 也包含来自 Parent 的字段 common1 和 common2(可能更多)。

这可能吗?如果可能的话怎么办?

这不是您问题的确切答案,但我们可以做类似的事情来共享通用参数。

message Child1 { 
    required int c1 = 2;
    required string c2 = 3;
}

message Child2 { 
    required int c1 = 2;
    required string c2 = 3;
}

message Request {
    required string common1 = 0;
    optional string common2 = 1;
    oneof msg { Child1 c1 = 2; Child2 c2 = 3; }

}

其他选项是使用 extend 关键字

message Parent {
    required string common1 = 0;
    optional string common2 = 1;
}

message Child1 { 
    extend Parent
    {       
        optional Child1 c1 = 100;
    }

    required int c1 = 2;
    required string c2 = 3;
}

尽管 protobuf 不直接支持继承,但在某些语言(例如 C#)中,您仍然可以使用部分 classes 为 service/request/reply 等创建通用契约。

您可以创建生成的部分 class,并将其 inherit/implement 作为您的常用场景。

通过这种方式,您可以确保内部模型和服务中的共同合同。

但是请注意,这仅供内部使用,因为端点和 API 表面应该完全不符合您的规范。