推荐目录结构

标准布局

my-app/
├── Cargo.toml
├── appsettings.json
├── appsettings.Development.json
├── wwwroot/                  # SPA 前端(可选)
└── src/
    ├── main.rs               # 组合根:Host 启动,仅框架级配置
    ├── startup.rs            # IHostedService 初始化
    ├── common/               # 共享工具、bootstrap、拦截器
    ├── contracts/            # 契约:Request/Response/enum/I…Service
    ├── handlers/             # 应用层:Handler + Service 实现
    └── domain/               # 实体 + 迁移

**不设** `services/`、`requests/` 目录。业务接口在 `contracts/`,实现在 `handlers/`。

模块声明

// main.rs
mod common;
mod contracts;
mod handlers;
mod domain;
mod startup;

各目录说明

| 目录 | 内容 | 依赖 | |------|------|------| | `contracts/` | `IRequest`、DTO、enum、`IBlogService` 等 trait | 仅框架 | | `handlers/` | `LoginHandler`、`BlogService`(impl `IBlogService`) | contracts、domain | | `domain/` | `UserEntity`、migrations | contracts(可选)、无框架 | | `common/bootstrap.rs` | `AppPaths`、`DbContext` 手动注册 | 基础设施 | | `appsettings.json` | 端口、JWT、缓存等框架配置 | — |

规模扩展

中型项目(单 crate 多文件)

按业务域拆分 contracts 与 handlers(同名校验):

contracts/
├── auth.rs       # LoginRequest + IAuthService trait
├── blog.rs       # Blog DTO + IBlogService trait
└── docs.rs

handlers/
├── auth.rs       # AuthService + LoginHandler
├── blog.rs       # BlogService + BlogHandlers
└── docs.rs

大型项目(workspace 多 crate)

my-app/
├── crates/
│   ├── api/          # Host 入口(main.rs)
│   ├── contracts/    # 共享契约 crate
│   ├── handlers/     # 实现 crate
│   └── domain/       # 领域模型 crate

跨 crate 时仍遵守:contracts 不依赖 domain;domain 可依赖 contracts。

小结

从一开始就采用约定结构,避免项目长大后的重构痛苦。详见 [Contracts / Handlers / Domain 分层](contracts-handlers-domain.md)。

下一节:[职责归属与边界](responsibility-division.md)