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
類庫專案,會發現在obj\Debug\net6.0\Protos
目錄下生成了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協議檔案
即可。