如何在C#中正确导入不同项目的Proto文件?

问题描述 投票:0回答:1
c# protocol-buffers
1个回答
0
投票

从不同项目导入原始文件非常棘手,我发现这个解决方案非常费力。所以我想与社区分享

我正在使用微服务架构,我希望我的消息 ProtoFiles 应该在 SharedProto 项目中并在不同的项目中使用它们

假设我在 SharedProto 中有消息 Proto 文件

SharedProto
--Protos
----company_dto.proto
----branch_dto.proto
---- ...

company_dto.proto的内容

syntax = "proto3";

option csharp_namespace = "SharedProto.Protos";

package sharedproto.protos;
// *** DTO
message CompanyDto {
  int32 Id = 1;
  string Code = 2;
  string Name = 3;
  string Logo = 4;
  string Website = 5;
}

SharedProto.csproj 的内容

....
<ItemGroup>
    <Protobuf Include="Protos\company_dto.proto" GrpcServices="None">
    <Protobuf Include="Protos\branch_dto.proto" GrpcServices="None">
</ItemGroup>
....

我拥有服务原型的项目组织

Organization
...
--Protos
----company_rpc.proto
----branch_rpc.proto
...

我想将

comapany_dto.proto
(属于 SharedProto 项目的一部分)导入到
comapany_rpc.proto
(属于 Organization 项目的一部分)。让我们看看
.csproj
文件,因为所有的技巧都在这里:

组织.csproj的内容

  <ItemGroup>
    <ProjectReference Include="..\SharedProto\SharedProto.csproj">
      <GlobalPropertiesToRemove></GlobalPropertiesToRemove>
    </ProjectReference>
  </ItemGroup>
  <ItemGroup>
    <!-- DTOs -->
    <Protobuf Include="..\SharedProto\Protos\company_dto.proto" ProtoRoot=".." GrpcServices="None" Link="Protos\company_dto.proto" />
    
    <Protobuf Include="Protos\company_rpc.proto" AdditionalImportDirs="../SharedProto" GrpcServices="Server" />
  </ItemGroup>

如果您看到上面的 Organzation.csproj 文件,那么您需要了解一些非常重要的要点,以避免

file not found error 
从其他项目导入 proto 文件。

ProtoRoot=".."
Link="Protos\company_dto.proto"
之后,将此
AdditionalImportDirs="../SharedProto"
添加到要导入文件的
<Protobuf Include=....
上。但是,在这些设置之后,您可以在其他项目中导入 SharedProto 文件,在我的例子中它是组织项目。看看吧

company_rpc.proto内容

syntax = "proto3";

import "google/protobuf/empty.proto";
import "Protos/company_dto.proto";

package organization.companyrpc;

// *** Rpc-Service

service CompanyRpcService {
  // Retrieve All
  rpc GetAllCompanies (google.protobuf.Empty) returns (GetCompanyListResponse){
    
  }
  ....

}
// Response: Retrieve All 
message GetCompanyListResponse {
  repeated sharedproto.protos.CompanyDto DtoRows = 1;
  string Message = 2;
}

如果您看到我的

company_rpc.proto
文件,您就会了解我如何导入它(
import "Protos/company_dto.proto";
)以及我如何使用它(
sharedproto.protos.CompanyDto DtoRows

记住这个

sharedproto.protos
来自company_dto.proto文件中的包名称

上述设置适用于我的 .net core grpc 2.60.0 和 .net core 8

© www.soinside.com 2019 - 2024. All rights reserved.