21 个版本
0.2.16 | 2024 年 7 月 19 日 |
---|---|
0.2.15 | 2024 年 1 月 28 日 |
0.2.8 | 2023 年 11 月 19 日 |
0.1.4 | 2023 年 3 月 17 日 |
0.1.3 | 2023 年 1 月 7 日 |
#158 在 WebAssembly
131 个月下载量
26KB
308 代码行
PortalDI
PortalDI 是一个轻量级、易于使用且支持编译时依赖注入 (DI) 的 Rust 库。
特性
-
依赖注入的便捷 API。
在大多数情况下,您可以专注于目标类型,而无需担心容器。
Hoge::di().hello();
-
原生异步支持。
- 启用了异步组件创建。
AsyncHoge::di() .await .hello()
-
通过 proc-macros 支持DRY。
PortalDI的proc-macro可以生成几乎所有的样板代码。
#[derive(DIPortal)] struct Hoge { foo: DI<Foo>, ... }
-
WebAssembly 支持。
-
在 WebAssembly 目标中,PortalDI 将 DI 容器编译为与 Rc 兼容。
-
在非 WebAssembly 目标中,组件和特质必须是
线程安全
(Sync + Send
)。
-
示例
use portaldi::*;
#[derive(DIPortal)]
struct Hoge {
foo: DI<dyn FooI>,
bar: DI<Bar>,
}
impl Hoge {
fn say_hello(&self) {
println!("hello hoge < {}, {}", self.foo.hello(), self.bar.hello())
}
}
pub trait FooI: DITarget {
fn hello(&self) -> &str;
}
#[derive(DIPortal)]
#[provide(FooI)]
struct Foo {}
impl FooI for Foo {
fn hello(&self) -> &str {
"hello foo"
}
}
#[derive(DIPortal)]
struct Bar {}
impl Bar {
fn hello(&self) -> &str {
"hello bar"
}
}
fn main() {
Hoge::di().say_hello();
}
指南
有关详细指南,请参阅 文档页面
许可证
根据您的选择,受 Apache 许可证 2.0 版 或 MIT 许可证 许可。
除非您明确声明,否则根据 Apache-2.0 许可证定义,您提交的任何有意包含在此项目中的贡献都应如上所述双重许可,而无需任何附加条款或条件。
依赖项
~2.7–4MB
~78K SLoC