#injection #di #dependency-injection

simple-di

为 Rust 提供简单的依赖注入

2 个版本

0.1.1 2024 年 6 月 3 日
0.1.0 2024 年 6 月 1 日

1161Rust 模式

Download history 339/week @ 2024-05-30 42/week @ 2024-06-06 3/week @ 2024-06-13

每月 78 次下载

MIT 许可证

8KB
126

simple-di

为 Rust 提供简单的依赖注入

示例

use simple_di::{inject, inject_optional, provide};

struct Point {
    x: f64,
    y: f64,
}

trait GetX {
    fn get_x(&self) -> f64;
}

trait GetY {
    fn get_y(&self) -> f64;
}

impl GetX for Point {
    fn get_x(&self) -> f64 {
        self.x
    }
}

impl GetY for Point {
    fn get_y(&self) -> f64 {
        self.y
    }
}

fn main() {
    let point = Point { x: 1.0, y: 2.0 };
    provide!(point => GetX, GetY);

    use_point();
    use_get_x();
    use_get_y();
}

fn use_point() {
    let point = inject::<Point>();
    let Point { x, y } = *point;
    println!("x: {x}, y: {y}");
}

fn use_get_x() {
    let abstract_get_x = inject!(GetX);
    let x = abstract_get_x.get_x();
    println!("x: {x}");

    let abstract_get_x = inject_optional!(GetX);
    if let Some(abstract_get_x) = abstract_get_x {
        let x = abstract_get_x.get_x();
        println!("x: {x}");
    } else {
        println!("GetX is not provided");
    }
}

fn use_get_y() {
    let abstract_get_y = inject!(GetY);
    let y = abstract_get_y.get_y();
    println!("y: {y}");

    let abstract_get_y = inject_optional!(GetY);
    if let Some(abstract_get_y) = abstract_get_y {
        let y = abstract_get_y.get_y();
        println!("y: {y}");
    } else {
        println!("GetY is not provided");
    }
}

依赖项

~0.9–6MB
~20K SLoC