.NET Core API分层架构目录与类命名规范咨询
.NET Core API 架构规范优化建议
针对你提出的N层架构.NET Core API目录结构、命名规范及组件组织问题,结合.NET生态主流实践,给出如下优化建议:
一、目录结构优化
你的初步方案已具备基础框架,调整部分细节以提升可读性和扩展性:
Apiproject/ ├── Controllers/ # API控制器,处理HTTP请求 │ ├── *Controller.cs # 示例:OrderController.cs ├── Enums/ # 枚举类型,替换原enumerables,命名更规范 │ ├── *.cs # 示例:OrderStatusEnum.cs ├── Handlers/ # 业务逻辑处理类(命令/查询处理) │ ├── Abstractions/ # 处理接口,分层更清晰 │ │ ├── I*Handler.cs # 示例:ICreateOrderHandler.cs │ ├── Implementations/ # 接口实现,替换原implementors,命名更标准 │ │ ├── *Handler.cs # 示例:CreateOrderHandler.cs ├── Models/ # 领域模型(核心业务对象) │ ├── *.cs # 示例:Order.cs ├── DTOs/ # 数据传输对象,复数形式符合惯例 │ ├── Requests/ # 请求DTO │ │ ├── *.cs # 示例:CreateOrderRequest.cs │ ├── Responses/ # 响应DTO │ │ ├── *.cs # 示例:OrderDetailResponse.cs ├── Validators/ # 验证器 │ ├── *Validator.cs # 示例:CreateOrderRequestValidator.cs ├── Repositories/ # 数据访问仓储 │ ├── Abstractions/ # 仓储接口 │ │ ├── I*Repository.cs # 示例:IOrderRepository.cs │ ├── Implementations/ # 仓储实现 │ │ ├── *Repository.cs # 示例:OrderRepository.cs ├── Entities/ # EF Core实体类,从Repositories下独立,便于跨层复用 │ ├── *.cs # 示例:OrderEntity.cs ├── Auth/ # 认证授权相关组件 │ ├── Middlewares/ # 认证中间件 │ │ ├── *.cs # 示例:JwtAuthMiddleware.cs │ ├── Filters/ # 授权过滤器 │ │ ├── *.cs # 示例:PermissionFilter.cs ├── Middlewares/ # 全局通用中间件(日志、异常处理等) │ ├── *.cs # 示例:GlobalExceptionMiddleware.cs ├── Filters/ # 全局通用过滤器(模型验证、性能监控等) │ ├── *.cs # 示例:ModelValidationFilter.cs ├── Utils/ # 通用工具类 │ ├── *.cs # 示例:DateTimeUtility.cs
二、命名空间规范
严格遵循.NET PascalCase命名规则,与目录结构一一对应:
- 控制器:
Apiproject.Controllers - 枚举:
Apiproject.Enums - 处理接口:
Apiproject.Handlers.Abstractions - 处理实现:
Apiproject.Handlers.Implementations - 领域模型:
Apiproject.Models - 请求DTO:
Apiproject.DTOs.Requests - 响应DTO:
Apiproject.DTOs.Responses - 验证器:
Apiproject.Validators - 仓储接口:
Apiproject.Repositories.Abstractions - 仓储实现:
Apiproject.Repositories.Implementations - 实体类:
Apiproject.Entities - 认证中间件:
Apiproject.Auth.Middlewares - 全局中间件:
Apiproject.Middlewares
三、类命名规范
1. Handler命名优化
如果你的Handler用于处理命令/查询(CQRS模式),建议采用更明确的命名,避免模糊的*Handler:
- 接口:
I[Command/QueryName]Handler,如ICreateOrderHandler、IGetOrderDetailHandler - 实现:
[Command/QueryName]Handler,如CreateOrderHandler、GetOrderDetailHandler
如果是通用业务处理,保持I*Handler和*Handler也可,但需确保名称体现具体职责,比如OrderStatusUpdateHandler而非OrderHandler。
2. 其他类命名
- 控制器:必须以
Controller结尾,如OrderController - 枚举:建议以
Enum结尾(可选,提升可读性),如OrderStatusEnum - DTO:请求类以
Request结尾,响应类以Response结尾,如CreateOrderRequest、OrderListResponse - 验证器:与目标DTO/模型对应,以
Validator结尾,如CreateOrderRequestValidator - 仓储:接口以
I开头,实现以Repository结尾,如IOrderRepository、OrderRepository - 实体类:可直接用业务名称,或加
Entity后缀区分领域模型,如OrderEntity - 工具类:以
Utility或功能名称结尾,如DateTimeUtility、EncryptionHelper
四、中间件与Action Filters组织
1. 中间件
- 按功能拆分目录:认证相关中间件放在
Auth/Middlewares,全局通用中间件(异常处理、日志、请求追踪)放在根目录Middlewares - 每个中间件单独一个文件,类名与文件名一致,如
GlobalExceptionMiddleware.cs - 在
Program.cs中通过app.UseMiddleware<GlobalExceptionMiddleware>()注册
2. Action Filters
- 按职责划分:授权过滤器放在
Auth/Filters,通用过滤器(模型验证、性能监控)放在根目录Filters - 类名明确体现功能,如
PermissionFilter、ModelValidationFilter - 全局过滤器在
Program.cs中通过builder.Services.AddControllers(options => options.Filters.Add<ModelValidationFilter>())注册 - 局部过滤器直接在Controller或Action上标注特性,如
[Permission("Order:Edit")]
总结
上述调整保留了你原有方案的核心架构,同时贴合.NET社区主流实践,提升了代码的可读性、可维护性和扩展性。Handler命名建议结合具体业务场景明确化,中间件与过滤器按功能拆分组织,便于后续迭代和团队协作。
内容的提问来源于stack exchange,提问作者Daniel Vega
相关产品推荐
相关产品推荐

