10 个版本
0.1.8 | 2021 年 6 月 21 日 |
---|---|
0.1.7 | 2021 年 6 月 20 日 |
0.1.6 | 2021 年 4 月 11 日 |
0.1.3 | 2021 年 3 月 21 日 |
0.0.0 | 2021 年 3 月 13 日 |
#2363 在 Rust 模式
12KB
159 行
Autowired
Autowired 是一个受 Spring IOC 启发的 Rust 依赖注入项目。
添加依赖
[dependencies]
autowired="0.1"
使用
只需使用宏 Component
推导你的结构体,你就可以在所有地方使用单例组件。
#[derive(Default, Component)]
struct Bar {
name: String,
age: u32,
}
fn main() {
// central registration in the beginning of the program
setup_submitted_beans();
// create `bar` via Default::default
let bar: Autowired<Bar> = Autowired::new();
assert_eq!(String::default(), bar.name);
assert_eq!(u32::default(), bar.age);
}
定义自定义组件初始化逻辑
struct Goo { pub list: Vec<String> }
#[autowired::bean]
fn build_goo() -> Goo {
Goo { list: vec!["hello".to_string()] }
}
fn main() {
// central registration in the beginning of the program
setup_submitted_beans();
let goo = Autowired::<Goo>::new();
assert_eq!("hello", goo.list[0])
}
懒加载组件
默认情况下,组件通过 setup_submitted_beans
注册。如果你需要懒加载注册组件,可以参考这个示例
use std::sync::Arc;
use autowired::{ LazyComponent, setup_submitted_beans, bean, Autowired};
#[allow(dead_code)]
#[derive(Default, LazyComponent)]
struct Bar {
name: Arc<String>,
age: u32,
}
#[allow(dead_code)]
struct Goo { pub list: Vec<String> }
#[bean(lazy)]
fn build_goo() -> Goo {
Goo { list: vec!["hello".to_string()] }
}
#[test]
fn lazy() {
setup_submitted_beans();
assert!(!autowired::exist_component::<Bar>());
assert!(!autowired::exist_component::<Goo>());
let bar = Autowired::<Bar>::new();
assert!( bar.name.is_empty());
let goo = Autowired::<Goo>::new();
assert_eq!("hello", goo.list[0]);
assert!(autowired::exist_component::<Bar>());
assert!(autowired::exist_component::<Goo>());
}
可选组件
函数式豆构造函数可以返回带有属性 #[bean(option)]
的 Option
。
如果返回值是 None
,则此豆将不会被提交。
如果您喜欢,此功能可以与懒加载组件一起使用,#[bean(option, lazy)]
。
#[allow(dead_code)]
struct Bar {
name: String,
}
/// return `None`, this bean will not be submitted
#[bean(option)]
fn build_bar_none() -> Option<Bar> {
None
}
#[allow(dead_code)]
struct Goo {
pub list: Vec<String>,
}
#[bean(option)]
fn build_goo_some() -> Option<Goo> {
Some(Goo { list: vec!["hello".to_string()] })
}
#[test]
fn option() {
setup_submitted_beans();
assert!(!autowired::exist_component::<Bar>());
assert!(autowired::exist_component::<Goo>());
let goo = Autowired::<Goo>::new();
assert_eq!("hello", goo.list[0]);
}
依赖项
~0.5–1.1MB
~25K SLoC