## 自动生成代码
### 代码自动生成
## `data` 目录解析
`data` 是项目的**数据访问对象(DAO)层**,遵循传统的 DAO 设计模式,作为业务逻辑与数据库之间的抽象层。目前处于早期阶段,定义了一个示例 `DBDao` 结构体作为 DAO 的模板。
### 文件结构
```
data/
├── mod.rs # 模块导出
├── dbdao.rs # DAO 结构体定义 DBDao
├── dbdao_init.rs # DBDao 的 DI 注册(自动生成)
└── dbdao_test.rs # DAO 测试 + DI 单例/多例验证
```
---
### 核心设计:`DBDao`
[dbdao.rs](file:///E:/soft/gitee.com/ruwebframe/src/data/dbdao.rs) 是目前唯一的 DAO:
```rust
use crate::rubase::BaseEntity;
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Clone, Default, Serialize)]
pub struct DBDao {}
impl BaseEntity for DBDao {} // ⭐ 多例模式
impl DBDao {
pub fn test(&self) -> String {
"test".to_string()
}
}
```
**设计要点**:
- 实现了 `BaseEntity`(多例模式),每次 `get_bean` 返回新实例
- 派生 `Default`,DI 容器通过 `DBDao::default` 构造
- 目前是空壳模板,方法预留了 `test()` 用于验证
---
### DI 注册(自动生成)
[dbdao_init.rs](file:///E:/soft/gitee.com/ruwebframe/src/data/dbdao_init.rs) 由 `rucmd rudi all` 自动生成:
```rust
#[ctor(unsafe)]
pub fn init() {
register_bean_dbdao();
}
pub fn find_bean_dbdao() -> Option<Arc<DBDao>> {
direg::get_bean::<DBDao>(SINGLE_BEAN_NAME)
}
pub fn register_bean_dbdao() {
direg::register(SINGLE_BEAN_NAME, DBDao::default); // 多例注册
}
```
---
### 测试文件中的验证逻辑
[dbdao_test.rs](file:///E:/soft/gitee.com/ruwebframe/src/data/dbdao_test.rs) 除了测试 DAO 本身,还包含了**单例/多例模式的验证**:
```rust
// 测试1:触发 DI 代码生成
#[test]
fn test_01_rudi() {
find_bean_difactroy().unwrap().make_di()
}
// 测试2:DAO 基本功能
#[test]
fn test_02_dbdao() {
let s = data::find_bean_dbdao().unwrap().test();
assert_eq!("test", s);
}
// 测试3:验证单例模式 — 两次获取地址相同
#[test]
fn test_03_single_case() {
let bean1 = find_bean_difactroy().unwrap();
let bean2 = find_bean_difactroy().unwrap();
let addr1 = Arc::as_ptr(&bean1);
let addr2 = Arc::as_ptr(&bean2);
assert_eq!(addr1, addr2); // ✅ 单例:地址相同
}
// 测试4:验证多例模式 — 两次获取地址不同
#[test]
fn test_04_multi_case() {
let bean1 = cfgdto::find_bean_gorm().unwrap();
let bean2 = cfgdto::find_bean_gorm().unwrap();
let addr1 = Arc::as_ptr(&bean1);
let addr2 = Arc::as_ptr(&bean2);
assert_ne!(addr1, addr2); // ✅ 多例:地址不同
}
```
---
### 架构定位
`data` 目录在整个项目中的位置:
```
┌─────────────────────────────────────────────────────────┐
│ 业务层 / 领域层 │
│ rudomain / rudb / dbentity / dbexample │
│ → 定义 Person、User 等实体 │
└────────────────────────┬────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ data (DAO 层) │
│ │
│ DBDao / find_bean_dbdao() │
│ → 封装数据库 CRUD 操作 │
│ → 多例模式,每次调用创建新实例 │
└────────────────────────┬────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────┐
│ database (连接层) │
│ Database (PostgreSQL) / RedisClient (Redis) │
│ → 底层连接管理、连接池 │
└─────────────────────────────────────────────────────────┘
```
---
### 设计意图
| `rudomain` | 实体定义(POJO) | `Person { id, name, age }` |
| `data` | 数据访问(DAO) | `DBDao.insert_person()` / `DBDao.find_by_id()` |
| `database` | 连接管理 | `Database.conn()` / `RedisClient.get_key()` |
这是典型的**三层数据架构**:
- `data/DBDao` 是中间层,屏蔽底层数据库差异
- 业务代码不直接调用 `database::Database`,而是通过 `data::DBDao` 操作
- 未来可扩展为 `UserDao`、`OrderDao` 等业务 DAO
---
**总结**:`data` 目录是项目的 DAO 层,目前包含一个 `DBDao` 模板结构体,采用多例 DI 模式,处于早期搭建阶段。它的测试文件同时也是验证 rudi DI 框架单例/多例模式正确性的重要测试用例。后续业务 DAO(如 `UserDao`、`OrderDao`)将在此目录下扩展。