Rudi
Rudi,一个开箱即用的依赖注入框架。
由于 Rudi 最开始是以 Koin 为参考,写的基于函数 API 的依赖注入框架,后来发现 inventory 这个库,就又添加了一套属性宏 API。相比起来,函数 API 的功能更全面,遇到属性宏不支持的场景,还得用函数 API (又不是不能用) 。
但是为了使用属性宏更方便,在 0.2.0 版本中,我把函数 API 的中所有从容器中获取实例的功能,都移植到了属性宏中,所以现在只需要使用属性宏就可以用各种方式从容器中获取实例了。
迁移的过程还是很简单的,将原来使用在 struct
的 field
和 fn
的 argument
上的 #[di(...)]
改成 #[di(name = ...)]
,就可以了。
关于新增的属性宏 API,可以参考 Singleton / Transient。
一个 Web 应用的例子
代码语言:javascript复制use std::sync::Arc;
use rudi::{Context, Singleton};
trait Service {}
fn transform<T>(t: T) -> Arc<dyn Service>
where
T: Service 'static,
{
Arc::new(t)
}
#[derive(Clone)]
#[Singleton(binds = [transform])]
struct ServiceImpl;
impl Service for ServiceImpl {}
#[derive(Clone)]
#[Singleton]
struct Controller {
svc: Arc<dyn Service>,
}
#[Singleton]
fn Run(controller: Controller) {
let _ = controller.svc;
}
fn main() {
let mut cx = Context::auto_register();
cx.resolve()
}