21 个版本

0.10.3 2023 年 11 月 26 日
0.10.1 2023 年 1 月 16 日
0.10.0 2020 年 9 月 16 日
0.9.2 2020 年 3 月 17 日
0.2.4 2019 年 12 月 31 日

#320Rust 模式

Download history 12/week @ 2024-04-07 38/week @ 2024-04-14 32/week @ 2024-04-21 16/week @ 2024-04-28 22/week @ 2024-05-05 15/week @ 2024-05-12 23/week @ 2024-05-19 13/week @ 2024-05-26 17/week @ 2024-06-02 13/week @ 2024-06-09 13/week @ 2024-06-16 19/week @ 2024-06-23 4/week @ 2024-06-30 28/week @ 2024-07-07 9/week @ 2024-07-14 9/week @ 2024-07-21

51 每月下载量
4 crates 中使用

MIT/Apache

44KB
494 代码行

coi

Build Status docs.rs crates.io

Rust 的依赖注入

这个 crate 的目标是提供一个简单易用的依赖注入框架。性能不是首要关注点,但随着 crate 的成熟可能会成为考虑的因素。

示例

use coi::{container, Inject};
use std::sync::Arc;

// Inherit `Inject` on all traits you'd like to inject
pub trait Trait1: Inject {
    fn describe(&self) -> &'static str;
}

// derive `Inject` on all structs that will provide the implementation
#[derive(Inject)]
#[coi(provides dyn Trait1 with Impl1)]
struct Impl1;

// actually impl the trait
impl Trait1 for Impl1 {
    fn describe(&self) -> &'static str {
        "I'm impl1!"
    }
}

pub trait Trait2: Inject {
    fn deep_describe(&self) -> String;
}

#[derive(Inject)]
#[coi(provides dyn Trait2 with Impl2::new(trait1))]
struct Impl2 {
    // inject dependencies by Arc<dyn SomeTrait>
    #[coi(inject)]
    trait1: Arc<dyn Trait1>,
}

impl Impl2 {
    fn new(trait1: Arc<dyn Trait1>) -> Self {
        Self { trait1 }
    }
}

impl Trait2 for Impl2 {
    fn deep_describe(&self) -> String {
        format!("I'm impl2! and I have {}", self.trait1.describe())
    }
}

// It even works on structs
#[derive(Debug, Inject)]
#[coi(provides JustAStruct with JustAStruct)]
pub struct JustAStruct;

fn main() {
    // Then construct your container with the helper `container!` macro
    let container = container!{
        trait1 => Impl1Provider,
        trait2 => Impl2Provider; scoped,
        struct => JustAStructProvider; singleton
    };

    // And resolve away!
    let trait2 = container
        .resolve::<dyn Trait2>("trait2")
        .expect("Should exist");
    println!("Deep description: {}", trait2.as_ref().deep_describe());
    let a_struct = container
        .resolve::<JustAStruct>("struct")
        .expect("Should exist");
    println!("Got struct! {:?}", a_struct);
}

名称

名称 coi 来自 IoC(控制反转)的倒写。

许可证

在您的选择下,根据 Apache 许可证,版本 2.0MIT 许可证 许可。
除非您明确说明,否则您有意提交给此 crate 的任何贡献,根据 Apache-2.0 许可证定义,均应以上述双重许可方式许可,不附加任何额外条款或条件。

SPDX-许可证-标识符: MIT Apache-2.0

依赖

~0.3–1.2MB
~24K SLoC