#injection #ioc #di #dependencies

injectiny

为 Rust 设计的微型依赖注入工具

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日

20 in #injection

MIT 许可证

11KB
79 行代码(不含注释)

为 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
~36K SLoC