Rudi
Rudi,一个开箱即用的 Rust 依赖注入框架。
在之前的 Rudi 版本中,有 2 种作用域,Singelton
和 Transient
,Singleton
需要类型实现 Clone
,能从 Context
取到引用和有所有权的实例,Transient
不需要实现 Clone
,每次从 Context
取到的都是新创建的实例。
但是这 2 种作用域仍然不能覆盖所有场景,比如有些类型只创建一次,只需要引用就可以调用方法,但是没有实现 Clone
,不管是开发者忘了还是故意不实现,都会导致无法使用 Singleton
作用域。这种情况下当然可以用 Rc
或 Arc
包一层,但是我觉得这种情况下,应该有更好的解决方案。
于是在最新的 0.7.0 版本中,我新添加了 SingleOwner
作用域,这种作用域下,类型不需要实现 Clone
,但是只能从 Context
取到引用,不能取到所有权。
示例
代码语言:javascript复制use rudi::{Context, SingleOwner, Singleton};
struct NotCloneable(i32);
// 注册一个 SingleOwner 作用域的类型
#[SingleOwner]
fn One() -> NotCloneable {
NotCloneable(1)
}
#[Singleton]
fn Run(#[di(ref)] one: &NotCloneable) {
let one = one.0;
assert_eq!(one, 1);
println!("one: {}", one);
}
fn main() {
let mut cx = Context::auto_register();
cx.resolve()
}
更多信息可以在仓库上看到,尤其是 Releases 里的版本更新说明。
Rudi https://github.com/ZihanType/rudi
欢迎各位使用,有问题欢迎提 issue,如果觉得好用,可以点个 star。