#injection #proc-macro #di #ioc #dependencies

injectiny_proc_macro

Injectiny 的 proc_macro 包

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 中使用

MIT 许可证

7KB
107 代码行

一个小巧的 Rust 依赖注入库。

此库提供了一种简单的方法将依赖注入到结构体中。Injectiny 不是 一个框架,但可以在框架中使用。请参阅 README.md 以了解如何使用它的示例。

安装

要使用 Injectiny,请确保包含 injectinyinjectiny_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