< 返回版块

ZihanType 发表于 2023-08-11 15:47

Tags:依赖注入, dependency-injection, DI, IOC

Rudi

Rudi,一个开箱即用的依赖注入框架。

由于 Rudi 最开始是以 Koin 为参考,写的基于函数 API 的依赖注入框架,后来发现 inventory 这个库,就又添加了一套属性宏 API。相比起来,函数 API 的功能更全面,遇到属性宏不支持的场景,还得用函数 API (又不是不能用)

但是为了使用属性宏更方便,在 0.2.0 版本中,我把函数 API 的中所有从容器中获取实例的功能,都移植到了属性宏中,所以现在只需要使用属性宏就可以用各种方式从容器中获取实例了。

迁移的过程还是很简单的,将原来使用在 structfieldfnargument 上的 #[di(...)] 改成 #[di(name = ...)],就可以了。

关于新增的属性宏 API,可以参考 Singleton / Transient

一个 Web 应用的例子

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()
}

评论区

写评论

还没有评论

1 共 0 条评论, 1 页