injection 0.1.0

A lightweight dependency injection container for Rust applications
Documentation
# Injection - 依赖注入容器


Injection 是一个轻量级的依赖注入容器,用于 Rust 应用程序。它支持实例注入和类型注入(延迟初始化),能够管理复杂的依赖关系。

## 功能特性


- **实例注入**:直接注入已创建的实例
- **类型注入**:通过工厂函数延迟初始化类型
- **依赖管理**:自动解决依赖关系
- **循环依赖检测**:防止循环依赖导致的问题
- **类型安全**:基于 Rust 的类型系统确保类型安全

## 安装


在 `Cargo.toml` 中添加:

```toml
[dependencies]
injection = { path = "./crates/injection" }
```

## 基本用法


```rust
use injection::{InjectionContainer, inject};
use anyhow::Result;

#[derive(Clone)]

struct DatabaseConnection {
    url: String,
}

impl DatabaseConnection {
    fn new(url: String) -> Self {
        DatabaseConnection { url }
    }
}

struct UserService {
    db: DatabaseConnection,
}

impl UserService {
    fn new(db: DatabaseConnection) -> Self {
        UserService { db }
    }
}

fn main() -> Result<()> {
    let mut container = InjectionContainer::new();
    
    // 注入实例
    let db = DatabaseConnection::new("localhost:5432".to_string());
    container.provide_instance(db)?;
    
    // 注入类型(延迟初始化)
    container.provide_type::<UserService, _>(|container| {
        let db = container.get::<DatabaseConnection>()?.clone();
        Ok(UserService::new(db))
    })?;
    
    // 获取实例
    let user_service = container.get::<UserService>()?;
    
    Ok(())
}
```

## 使用宏


Injection 提供了 `inject!` 宏来简化注入过程:

```rust
use injection::{InjectionContainer, inject};

let mut container = InjectionContainer::new();

// 注入实例
inject!(instance container, DatabaseConnection = DatabaseConnection::new("localhost:3306".to_string()));

// 注入类型
inject!(type container, UserService = |container: &mut InjectionContainer| -> UserService {
    let db = container.get::<DatabaseConnection>()?.clone();
    Ok(UserService::new(db))
});
```

## 复杂依赖示例


对于具有多层依赖关系的系统,Injection 可以自动解决依赖:

```rust
// 详见 examples/complex_dependency.rs
```

## API


### InjectionContainer


- `new()` - 创建新的容器实例
- `provide_instance<T>(instance: T)` - 注入一个实例
- `provide_type<T, F>(factory: F)` - 注入一个类型,使用工厂函数进行延迟初始化
- `get<T>()` - 获取类型的不可变引用
- `get_mut<T>()` - 获取类型的可变引用
- `has<T>()` - 检查类型是否已注册

## 错误处理


Injection 使用 `anyhow::Result` 进行错误处理,常见的错误包括:

- 尝试获取未注册的类型
- 检测到循环依赖
- 类型转换错误

## 许可证


MIT