ruwebframe 0.1.0

A brief description of your crate.
Documentation
rust rudi目录代码说明
15:38
Read 14 files, Browsed 1 folder
rudi 目录代码说明
rudi 是 ruwebframe 项目中的 依赖注入(Dependency Injection, DI) 子模块,对标 Java 中 Spring IoC 容器的设计思想,用 Rust 实现了一个轻量级的 Bean 管理容器。

目录结构
 

src/rudi/
├── mod.rs                 # 模块入口
├── di_example.rs          # 示例:演示注册+获取Bean
├── rucontainer/           # 核心容器
│   ├── mod.rs
│   ├── rucontainer.rs     # Container 容器实现
│   └── ruregister.rs      # 全局注册门面(静态容器)
├── di_factroy/            # 工厂层(预留扩展点)
│   ├── mod.rs
│   ├── di_factroy.rs      # DiFactroy 占位结构
│   ├── di_test.rs         # 针对di_template的测试
│   └── fatory_test.rs
├── di_template/           # 代码模板生成物(示例)
│   ├── mod.rs
│   ├── struct_init.rs     # 示例:用 ctor 自动注册
│   └── di_test.rs
└── di_trait/              # 容器抽象trait
├── mod.rs
└── ditrait.rs         # BeanRegistry trait
核心模块解析
1. rucontainer/rucontainer.rs — IoC 容器本体
   Entry 枚举:容器中存储的条目类型
   Factory:多例,每次 get 都调用工厂创建新实例
   Singleton:单例,首次 get 时创建并缓存(Mutex<Option<Arc<dyn Any>>>)
   Container 结构体:持有 HashMap<String, Entry>
   register() / register_singleton():注册工厂函数
   get():获取多例(需要 T: Clone)
   get_singleton():获取单例,返回 Arc<T>(零拷贝共享)
   get_bean():统一入口,自动根据 Entry 类型判断是单例还是工厂
   is_singleton():查询某个 key 是否为单例
   自动注册机制:
   Reg 结构体 + inventory::collect! 实现编译期收集
   bootstrap() 在容器初始化时扫描所有 inventory::submit! 的注册项
   两个 macro_rules! 宏:register_singleton! / register_transient!,一行完成声明式注册
2. rucontainer/ruregister.rs — 全局静态门面
   通过 OnceLock<RwLock<Container>> 提供全局唯一的容器实例:

global() 懒加载初始化容器,并自动调用 bootstrap() 完成所有 bean 的自动注册
对外暴露全局函数:register、register_singleton、get、get_singleton、get_bean
业务代码可在任意位置直接调用 ruregister::get_bean::<T>(key) 获取 Bean
3. di_trait/ditrait.rs — 容器抽象层
   定义 BeanRegistry trait,规范容器行为:

register() / register_singleton() / get_bean()
通过 trait 抽象便于后续替换实现、做 mock 测试
4. di_template/struct_init.rs — 代码模板产物示例
   展示了如何配合 ctor crate 实现启动时自动注册:


Rust

#[ctor(unsafe)]

pub fn register_bean_database() {
ruregister::register_singleton(SingleBeanName, Database::new);
}
程序启动时 ctor 自动执行该函数,把 Database 单例注册进全局容器。

5. di_factroy/ — 工厂扩展层
   DiFactroy 目前为占位结构体,预留了按包路径扫描、自动生成 Bean 的扩展点
   目录下测试文件演示如何通过模板生成的 struct_init 模块调用 Bean
6. di_example.rs — 完整使用示例
   演示了两种注册方式 + 三种获取方式的对比:

多例每次 id 不同,单例 id 相同
同时展示了手动注册 + #[ctor] 自动注册两种风格
设计亮点
特性	实现方式
单例/多例共存	Entry 枚举区分,get_bean 统一入口
类型安全	Any + downcast,编译期泛型保证
线程安全	Arc + Mutex + RwLock + OnceLock
零配置启动注册	ctor + inventory 实现编译期收集
全局访问	OnceLock 静态容器,任意位置可取 Bean
调用链总结

Plain Text

业务代码
→ ruregister::get_bean::<Database>("xxx")
→ global() // 懒加载OnceLock
→ bootstrap() // 扫描 inventory 注册项
→ Container::get_bean()
→ Entry::Singleton / Entry::Factory
→ 返回 Arc<T>
整体上 rudi 模块实现了一个轻量、线程安全、支持声明式注册的 Rust IoC 容器,是整个 ruwebframe 框架的基础设施之一。