#registry #run-time #dependency-injection

yadir

Yadir 是为 Rust 专为打造的另一个依赖注入注册表

8 个版本

0.3.2 2024 年 7 月 21 日
0.3.1 2024 年 7 月 21 日
0.2.3 2024 年 7 月 20 日
0.1.0 2024 年 7 月 15 日

692Rust 模式

Download history 349/week @ 2024-07-14 145/week @ 2024-07-21 48/week @ 2024-07-28

每月下载 542

自定义许可证

26KB
287

Yadir

GitHub Actions Workflow Status Crates.io Version

Yadir 是为 Rust 专为打造的另一个依赖注入注册表。


关于

Yadir 的 API 受到 .NET 的 Microsoft.Extensions.DependencyInjection 库的极大启发。它提供了一种简单且易于实现的方式,在运行时注册和解析 Rust 应用程序的依赖关系。

其初始实现基于 Will Crichton 在他的关于 Rust 类型驱动 API 设计 的书中的 注册设计模式

使用

将 Yadir 添加到您的 Cargo.toml 文件

[dependencies]
yadir = { version = "0.3.0", features = ["derive"] }

创建一个新的注册表,并注册您的依赖项,在为每个依赖项实现 DIBuilder 特性之后

use yadir::core::contracts::DIBuilder;
use yadir::core::primitives::{DIManager, DIObj};
use yadir::{deps, let_deps};
use async_trait::async_trait;
use dyn_clone::{clone_trait_object, DynClone};
use yadir_derive::DIBuilder;

clone_trait_object!(Printer);
clone_trait_object!(Writer);

trait Printer: Sync + Send + DynClone {
    fn print(&self) -> String;
}

trait Writer: Sync + Send + DynClone {
    fn write(&self) -> String;
}

#[derive(Clone, DIBuilder)]
#[build_as(Box<dyn Printer>)]
struct Bar;

impl Printer for Bar {
    fn print(&self) -> String {
        "bar".to_string()
    }
}

#[derive(Clone, DIBuilder)]
#[build_as(Box<dyn Writer>)]
struct Baz;

impl Writer for Baz {
    fn write(&self) -> String {
        "baz".to_string()
    }
}

#[derive(Clone, DIBuilder)]
#[build_method("new")]
struct Foo {
    #[deps]
    printer: Box<dyn Printer>,
    #[deps]
    writer: Box<dyn Writer>,
}

impl Foo {
    fn new(printer: Box<dyn Printer>, writer: Box<dyn Writer>) -> Self {
        Self { printer, writer }
    }

    fn print(&self) -> String {
        format!("foo {} {}", self.printer.print(), self.writer.write())
    }
}

#[tokio::main]
async fn main() {
    let mut manager = DIManager::default();
    manager.build::<Bar>().await;
    manager.build::<Baz>().await;
    
    let foo = manager.build::<Foo>().await.unwrap().extract();
    
    assert_eq!(foo.print(), "foo bar baz");
}

许可证

本项目采用 MIT 许可证 - 请参阅 LICENSE 文件以获取详细信息。

依赖项

~2.7–9MB
~75K SLoC