5 个版本
0.2.0 | 2024年6月19日 |
---|---|
0.1.3 | 2024年6月15日 |
0.1.2 | 2024年6月7日 |
0.1.1 | 2024年6月7日 |
0.1.0 | 2024年6月7日 |
#48 在 #ioc
在 injectiny 中使用
7KB
107 代码行
一个小巧的 Rust 依赖注入库。
此库提供了一种简单的方法将依赖注入到结构体中。Injectiny 不是 一个框架,但可以在框架中使用。请参阅 README.md 以了解如何使用它的示例。
安装
要使用 Injectiny,请确保包含 injectiny
和 injectiny_proc_macro
包。
cargo add injectiny
cargo add injectiny_proc_macro
示例
use std::cell::RefCell;
use std::rc::Rc;
use injectiny::{Injected, Injectable};
use injectiny_proc_macro::injectable;
// Model is an enum defining all the fields that can be injected
#[derive(Clone)]
enum Model {
Name(Rc<RefCell<String>>), // non-clonable objects should be wrapped in Rc<RefCell<T>>
Age(u32)
}
// The #[injectable] attribute macro generates an implementation of the Injectable trait for
// the given Model enum. In real situations, this could be one of several controllers, views, ...
#[injectable(Model)]
#[derive(Default)]
struct Injectee
{
// The #[inject] attribute macro marks a field as injectable with the enum member. The field
// type must be Injected<T>, where T is the type of the enum member's value.
#[inject(Model::Name)]
name: Injected<Rc<RefCell<String>>>,
#[inject(Model::Age)]
age: Injected<u32>
}
// This would represent a model
let name = Rc::new(RefCell::new("Patje".to_string()));
let age = 25;
// This could be one of many views
let mut injectee: Injectee = Default::default();
injectee.inject(Model::Name(name));
injectee.inject(Model::Age(age));
// The injected fields can be accessed like normal references
assert_eq!(&*injectee.name.borrow(), "Patje");
assert_eq!(*injectee.age, 25);
依赖项
~1.5MB
~35K SLoC