DDD
src/
├── main.rs # 程序入口,负责启动和依赖注入
├── lib.rs # 公共库入口,便于单元测试和复用
├── config.rs # 配置管理(如数据库、端口、环境变量等)
├── entities/ # 数据库实体(ORM模型)
│ ├── mod.rs
│ └── user.rs
├── schema.rs # 数据库表结构(如 diesel/sea-orm 生成)
├── repository/ # 数据访问层(Repository模式,封装数据库操作)
│ ├── mod.rs
│ └── user_repo.rs
├── service/ # 业务逻辑层(Service/Usecase)
│ ├── mod.rs
│ └── user_service.rs
├── api/ # 接口层(HTTP/WebSocket/TCP等协议的 handler)
│ ├── mod.rs
│ └── user_handler.rs
├── error.rs # 统一错误类型和处理
├── utils/ # 工具类/通用模块
│ └── logger.rs
└── tests/ # 集成测试└── ...
当然可以!下面给你一个**典型且规范的 Rust 服务端项目分层结构**,适合中大型项目,易于维护和扩展。
这种分层思想借鉴了 DDD(领域驱动设计)和主流 Web 框架(如 actix-web、axum)的最佳实践。
---
目录结构示例
src/
├── main.rs # 程序入口,负责启动和依赖注入
├── lib.rs # 公共库入口,便于单元测试和复用
├── config.rs # 配置管理(如数据库、端口、环境变量等)
├── entities/ # 数据库实体(ORM模型)
│ ├── mod.rs
│ └── user.rs
├── schema.rs # 数据库表结构(如 diesel/sea-orm 生成)
├── repository/ # 数据访问层(Repository模式,封装数据库操作)
│ ├── mod.rs
│ └── user_repo.rs
├── service/ # 业务逻辑层(Service/Usecase)
│ ├── mod.rs
│ └── user_service.rs
├── api/ # 接口层(HTTP/WebSocket/TCP等协议的 handler)
│ ├── mod.rs
│ └── user_handler.rs
├── error.rs # 统一错误类型和处理
├── utils/ # 工具类/通用模块
│ └── logger.rs
└── tests/ # 集成测试└── ...
---
## 2. 各层职责说明
- **main.rs**
只负责程序启动、配置加载、依赖注入、路由注册,不写业务逻辑。
- **config.rs**
负责读取和管理配置(如数据库连接、端口、环境变量等)。
- **entities/**
定义数据库表结构和数据模型(Model),只做数据结构描述,不包含业务逻辑。
- **repository/**
封装所有数据库操作(CRUD),对上层隐藏具体 ORM 实现,便于后续切换数据库或重构。
- **service/**
业务逻辑层,处理具体业务流程,调用 repository 层,聚合/编排数据。
- **api/**
对外接口层,处理 HTTP/WebSocket/TCP 请求,参数校验、响应封装,调用 service 层。
- **error.rs**
定义统一的错误类型,实现 From/Into,便于全局错误处理。
- **utils/**
放置日志、加解密、通用工具函数等。
- **tests/**
集成测试,模拟真实请求,保证各层协作无误。
---
## 3. 代码示例(简化版)
### main.rs
```rust
fn main() {
// 加载配置
let config = config::load();
// 初始化日志
utils::logger::init();
// 初始化数据库连接池
let db = repository::init_db(&config.db_url);
// 启动 HTTP 服务
api::start_server(db, config.server_port);
}
```
### api/user_handler.rs
```rust
pub async fn get_user_handler(
db: DbPool,
user_id: i32,
) -> Result<Json<UserDto>, AppError> {
let user = service::user_service::get_user_by_id(&db, user_id).await?;
Ok(Json(user.into()))
}
```
### service/user_service.rs
```rust
pub async fn get_user_by_id(
db: &DbPool,
user_id: i32,
) -> Result<User, AppError> {
repository::user_repo::find_by_id(db, user_id).await
}
```
### repository/user_repo.rs
```rust
pub async fn find_by_id(
db: &DbPool,
user_id: i32,
) -> Result<User, AppError> {
// ORM 查询
}
```
---
## 4. 规范建议
- 每层只做自己该做的事,**不跨层调用**。
- 业务逻辑尽量不写在 handler(api)里,方便测试和复用。
- 错误类型统一,便于全局处理和日志记录。
- 配置、日志、工具函数独立,便于维护。
- 目录和文件命名清晰,见名知意。
---
## 5. 参考项目
- [actix-web 官方示例](https://github.com/actix/examples)
- [axum 官方示例](https://github.com/tokio-rs/axum/tree/main/examples)
- [SeaORM 项目结构建议](https://www.sea-ql.org/SeaORM/docs/guides/project-structure/)
---
MVCS架构
src/
├── main.rs # 程序入口
├── config.rs # 配置管理
├── db.rs # 数据库连接和初始化
├── error.rs # 错误类型
├── models/ # Model:数据结构和数据库实体
│ ├── mod.rs
│ └── user.rs
├── views/ # View:响应渲染(DTO/模板等)
│ ├── mod.rs
│ └── user_view.rs
├── controllers/ # Controller:路由与流程控制
│ ├── mod.rs
│ └── user_controller.rs
├── services/ # Service:业务逻辑层
│ ├── mod.rs
│ └── user_service.rs
├── repository/ # Repository:数据访问层(可选,复杂项目建议加)
│ ├── mod.rs
│ └── user_repo.rs
├── utils/ # 工具类
│ └── logger.rs
└── tests/ # 集成测试└── ...
2. 各层职责
- Model(models/)
数据结构、数据库实体(ORM Model),只负责数据定义和转换。
- View(views/)
响应渲染(如 JSON/HTML/DTO),只做数据格式转换。
- Controller(controllers/)
路由注册、参数校验、调用 Service 层,组织业务流程,不直接操作数据库。
- Service(services/)
业务逻辑实现,聚合/编排数据,调用 Repository 层。
- Repository(repository/)(可选)
封装数据库操作,便于后续切换数据库或重构。