#di #ioc #inversion #dependency-injection #dependencies

portaldi

一个轻量级的、易于使用的编译时依赖注入库

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 日

#158WebAssembly

Download history 113/week @ 2024-07-14 18/week @ 2024-07-21

131 个月下载量

MIT/Apache

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