- A+
1、?说明
在上一篇文章gRPC之.Net6中的初步使用介绍中,我们简单的介绍了gRPC在服务端、客户端以及Web项目中的使用。
有一个问题,不知道大家发现没有,就是不管在服务端项目还是客户端项目中,我们都需要创建相同的proto协议文件
,这样就会显得很麻烦,有没有一种办法只创建一次proto协议文件
呢?答案是肯定的:有。
在介绍实现之前,建议大家先查看一下前一篇文章gRPC之.Net6中的初步使用介绍,方便后面关联性的讲解。
2、?实现
2.1、?新建类库项目
首先我们新建一个名称为Quber.Grpc.Common
的类库项目,目的就是用于存放proto协议文件
和协议文件生成的对应类文件
,如下图所示:
2.2、?添加引用
接下来我们在Quber.Grpc.Common
的类库项目中分别添加如下引用:
Google.Protobuf Grpc.Core.Api Grpc.Tools
2.3、?创建proto协议文件
我们在Quber.Grpc.Common
类库项目中新建一个文件夹Protos
,用于存放各种proto协议文件
,然后我们把Quber.Grpc.Service
项目中的user.proto协议文件
复制过来,复制过来后,将user.proto
协议文件中的命名空间
修改为Quber.Grpc.Common.Protos
(和该类库保持一致),如下图所示:
2.4、?修改协议文件属性
鼠标右键user.proto协议文件
,选择属性(或者鼠标选中user.proto协议文件
,然后按ALT+Enter快捷键打开文件属性窗体),在打开的属性窗体中,将Build Action
选项设置为Protobuf compiler
,将gRPC Stub Classes
选项设置为Client and Server
,然后点击应用确定即可,如下图所示:
此时,我们双击Quber.Grpc.Common
类库项目,在项目文件中,我们会发现有一个Protobuf
节点设置,并且该节点中的GrpcServices
属性值为Both
(Both
表示我们刚才选择的Client and Service
,Client
表示客户端,Service
表示服务端),如下图所示:
注意:如果项目的编辑文件中,没有Protobuf
节点设置,请手动增加进去,不然到时候在生成的时候不会生成协议文件
对应的类文件
2.5、?生成项目
此时我们重新生成下Quber.Grpc.Common
类库项目,会发现在objDebugnet6.0Protos
目录下生成了user.proto协议文件
对应的2个类文件,如下图所示:
2.6、?改造服务端和客户端项目
-
改造
Quber.Grpc.Service
项目在
Quber.Grpc.Service
项目中,我们添加对Quber.Grpc.Common
类库项目的引用,如下图所示:然后我们将
Quber.Grpc.Service
项目中的整个Protos
文件夹删除掉,如下图所示:修改
UserService.cs
服务文件中的命名空间,如下图所示:此时我们注意到
User.UserBase
、UserInfoResult
和UserInfoRequest
都来自我们新建的Quber.Grpc.Common
类库项目。运行
Quber.Grpc.Service
项目,如下图所示:如上图所示,
Quber.Grpc.Service
服务端就运行成功了。 -
改造
Quber.Grpc.Client
项目在
Quber.Grpc.Client
项目中,我们添加对Quber.Grpc.Common
类库项目的引用,如下图所示:然后我们将
Quber.Grpc.Client
项目中的整个Protos
文件夹删除掉,如下图所示:修改服务文件
UserTest.cs
和UserTestIoc.cs
以及启动文件Program.cs
中的命名空间,如下图所示:此时我们注意到
User.UserClient
和UserInfoRequest
都来自我们新建的Quber.Grpc.Common
类库项目。运行
Quber.Grpc.Client
项目,如下图所示:如上图所示,
Quber.Grpc.Client
客户端就运行成功了。
同理,我们可以将Quber.Grpc.Web
项目也按照上述说明进行调整,此处就不一一演示了。
??????通过上述步骤的演示,我们就达到了客户端和服务端公用一份proto协议文件
的目的,就不用在每个项目中新建相同的proto协议文件
了,后期只需要维护一份proto协议文件
即可。