使用编写的C#接口文件,生成Grpc需要的Proto文件
1.编译生成一个nuget包
2.编写一个用于生成Proto文件的控制台项目,然后在里面编写对于的C#Interface代码 (老代码直接在原项目中增加一个控制台即可)
3.在控制台项目中引入刚刚生成的nuget包
4.在Program中编写如下代码,其中IXXXService是我们需要转换的代码
class Program
{
static void Main(string[] args)
{
var generator = new GenerateProto();
var file = generator.GenerateProtoFile(typeof(IXXXService));
Console.WriteLine(file);
Console.ReadKey();
}
}
5.运行程序,会在根目录生成一个 XXX.proto文件
syntax ="proto3";
option csharp_namespace = "GenerateGrpcProto";
package XXX;
service XXX{
rpc GetDataById (GetDataByIdInput) returns (GetDataByIdOutput);
rpc SetDataById_Data (SetDataById_Data_Input) returns (SetDataById_Data_Output);
}
message SetDataById_Data_Output{
string result = 1;
}
message SetDataById_Data_Input{
int64 id = 1;
TestData data = 2;
}
message TestData{
}
message GetDataByIdOutput{
TestData result = 1;
}
message GetDataByIdInput{
int64 id = 1;
}
规则:
1.会给方法自动生成对应的message,包括0个参数的以及返回值为void的方法,例如
C#
void GetSomething();
void GetSomething(long Id);
生成的rpc方法
rpc GetSomething (GetSomethingInput) returns (GetSomethingOutput);
rpc GetSomethingById (GetSomethingByIdInput) returns (GetSomethingByIdOutput);
生成的message
message GetSomethingByIdOutput{
}
message GetSomethingByIdInput{
int64 id = 1;
}
message GetSomethingOutput{
}
message GetSomethingInput{
}
2.由于proto文件中不能有同名的方法名,所以如果遇到重载的时候,会变掉生成的方法名称,例如 C#接口文件中定义方法 ①无参数 会在方法名后 加上 Input ②一个参数 会在方法名后 加上 By参数名Input ③多个参数 会在方法名后 加上 By参数1_参数2_Input
TestData GetData();
TestData GetData(long Id);
TestData GetData(long Id,string name);
生成的Proto文件
rpc GetData (GetDataInput) returns (GetDataOutput);
rpc GetDataById (GetDataByIdInput) returns (GetDataByIdOutput);
rpc GetDataById_Name (GetDataById_Name_Input) returns (GetDataById_Name_Output);
3.目前支持类型C# int、long、数组、列表、字典