9个稳定版本
3.1.0 | 2023年12月20日 |
---|---|
3.0.0 | 2023年11月24日 |
2.1.2 | 2023年8月14日 |
2.1.1 | 2023年4月11日 |
1.0.0 | 2022年9月27日 |
#206 in Rust模式
98 每月下载次数
用于 3 crates
140KB
3K SLoC
More Dependency Injection
More DI 是一个针对 Rust 的依赖注入(DI)库。可以使用 trait
或 struct
作为注入类型。
你可能正在寻找
功能
此crate提供以下功能
- 默认 - 依赖注入的抽象,包括 builder 和 inject 功能
- builder - 配置服务描述符的函数
- async - 在异步上下文中使用依赖项
- inject - 生成常见的注入场景
- lazy - 懒初始化服务解析
- fmt - 额外的输出格式化
- alias - 使用替代类型别名
支持的生命周期
服务可以有以下生命周期
- 瞬态 - 每次请求时创建一个新实例
- 单例 - 第一次请求时创建一个单一的新实例
- 作用域 - 每次从提供者请求时创建一个新实例
依赖注入实战
考虑以下特质和结构。
不需要进程宏属性,但它们是添加 DI 到您应用程序的最快、最简单的方法。
use di::*;
use std::rc::Rc;
trait Phrase {
fn salutation(&self) -> &str;
}
#[injectable(Phrase)]
struct EnglishPhase;
impl Phrase for EnglishPhrase {
fn salutation(&self) -> &str {
"Hello world!"
}
}
#[injectable]
struct Person {
phase: Rc<dyn Phrase>,
}
impl Person {
fn speak(&self) -> &str {
self.phrase.salutation()
}
}
现在可以将此信息组合到简单的应用程序中
use crate::*;
use di::*;
fn main() {
let provider = ServiceCollection::new()
.add(EnglishPhrase::singleton())
.add(Person::transient())
.build_provider()
.unwrap();
let person = provider.get_required::<Person>();
println!("{}", person.speak());
}
许可证
该项目遵循 MIT 许可证。
依赖项
~0.1–9.5MB
~46K SLoC