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/)(可選)
封裝數據庫操作,便于后續切換數據庫或重構。