ASP.NET整洁架构项目中,gRPC的Proto文件与服务应置于哪层哪个目录?
在整洁架构的ASP.NET项目中放置gRPC Proto文件与服务的最佳实践
一、Proto 文件的层级与目录
整洁架构的核心原则是依赖向内,核心层(实体、用例)不依赖任何外部技术框架。Proto作为gRPC的服务契约,属于外部技术相关的接口描述,因此不能放在核心层。推荐两种落地方案:
方案1:独立契约类库(推荐)
- 创建单独的类库项目,命名如
YourProject.Grpc.Contracts - 项目根目录下新建
Protos文件夹,统一存放所有.proto文件 - 该项目仅维护gRPC服务契约,不包含任何业务逻辑或实现代码
- 优势:契约与实现完全解耦,内部或外部客户端只需引用此项目即可生成调用代码,严格遵循依赖倒置原则
方案2:接口适配器层内的契约目录
- 若不想单独创建项目,可将
Protos文件夹放在接口适配器层(如YourProject.Adapters项目)下的Grpc子目录中,示例路径:YourProject.Adapters/Grpc/Protos - 注意:接口适配器层可依赖核心层,但核心层绝对不能依赖它,因此契约仅用于描述对外暴露的接口,不能包含核心层内部细节
二、gRPC 服务实现的层级与目录
gRPC服务属于外部框架实现,必须放在整洁架构的最外层——框架与驱动层(通常是ASP.NET的Web宿主项目,如 YourProject.Web.Grpc)。
目录结构示例
- 宿主项目根目录下创建
GrpcServices文件夹,存放所有gRPC服务实现类 - 每个服务对应独立子目录,比如
GrpcServices/UserService下放置UserGrpcService.cs(实现proto生成的服务接口) - 服务实现类的核心职责:
- 接收gRPC请求,将请求模型转换为核心层的实体或用例输入模型
- 通过依赖注入调用用例层的业务逻辑接口
- 将用例执行结果转换为gRPC响应模型返回
三、依赖关系约束
- 框架与驱动层(gRPC宿主项目)依赖接口适配器层和核心层:服务实现需要调用用例逻辑,同时需引用契约项目获取proto生成的接口
- 接口适配器层可依赖核心层,但不能反向依赖框架与驱动层
- 核心层(实体、用例)完全不依赖gRPC相关代码,保持业务逻辑的纯粹性
四、完整项目结构示例
YourSolution/ ├── YourProject.Core/ # 核心层:实体、用例、业务端口 │ ├── Entities/ │ ├── UseCases/ │ └── Ports/ ├── YourProject.Adapters/ # 接口适配器层:数据适配、模型转换 │ ├── Data/ │ └── Grpc/ │ └── Protos/ # 可选:不单独建契约项目时的存放位置 ├── YourProject.Grpc.Contracts/# 独立契约项目(推荐) │ └── Protos/ │ ├── user_service.proto │ └── order_service.proto └── YourProject.Web.Grpc/ # 框架与驱动层:gRPC服务宿主 ├── GrpcServices/ │ ├── UserGrpcService.cs │ └── OrderGrpcService.cs └── Program.cs
内容的提问来源于stack exchange,提问作者Regestea
相关产品推荐
相关产品推荐

