| Crates.io | dris-rt |
| lib.rs | dris-rt |
| version | 0.1.1 |
| created_at | 2026-01-16 06:41:37.446035+00 |
| updated_at | 2026-01-21 09:38:46.546613+00 |
| description | 一个轻量的 Rust 编译期依赖注入(DI)代码生成器运行时支持库 |
| homepage | |
| repository | https://github.com/wuhaiji/dris |
| max_upload_size | |
| id | 2048018 |
| size | 6,548 |
dris-rt 是 dris 依赖注入(DI)代码生成器的运行时支持库,配合 dris-macros 与 dris-build 使用。
[dependencies]
dris-rt = "0.1.1"
[build-dependencies]
dris-build = "0.1.1"
在 build.rs 中生成容器代码:
fn main() {
dris_build::generate().unwrap();
}
声明组件与构造函数,并引入生成文件:
use dris_rt::{component, constructor};
#[component(singleton)]
pub struct AppConfig {
pub port: u16,
}
impl AppConfig {
#[constructor]
pub fn new() -> Self {
Self { port: 8080 }
}
}
include!(concat!(env!("OUT_DIR"), "/dris_gen.rs"));
fn main() {
let container = dris_gen::Container::build();
let cfg = container.app_config(); // root getter
println!("port={}", cfg.port);
}
支持:
T:按值注入(通常用于 Prototype)。&T:借用注入(零开销;仅支持 Singleton)。Rc<T>:单线程共享所有权。Arc<T>:跨线程共享所有权。生成器会按“实际被注入的类型”推断单例在 Container 内部的持有方式:
&T → Container 内存 T(读路径零开销)。Rc<T> → Container 内存 Rc<T>。Arc<T> → Container 内存 Arc<T>。Rc<T> 与 Arc<T> → 直接报错(无法保证同一实例同时以两种指针形式存在)。Prototype:每次获取都会构建新实例。Singleton:容器构建时只构建一次并复用。常用方式:
#[component(singleton)] 强制单例。dris-build 不做 cfg 条件裁剪(会解析 src/**/*.rs),因此当前版本不支持在 cfg/cfg_attr 作用域里声明组件/构造函数(包括 #[cfg_attr(..., component/constructor)])。建议把 cfg 放在实现细节里,不要切换组件类型/构造函数本身。Arc/Rc<dyn Trait> 注入:当且仅当某个 trait 只有一个实现时可直接注入;多个实现请用 dris_rt::All<Arc/Rc<dyn Trait>>(或 dris_rt::All<(dris_rt::Type, Arc/Rc<dyn Trait>)>)。