第二章 快速上手
本章带你快速入门 rust-dix,从安装到第一个 DI 容器。
本章小节
| 小节 | 内容 | |------|------| | [安装与依赖配置](installation.md) | Cargo.toml 配置 | | [第一个 DI 容器](first-container.md) | 基础示例 | | [生命周期选择](lifetime-choice.md) | Singleton/Scoped/Transient 决策 |
安装
在 `Cargo.toml` 中添加依赖:
[dependencies]
rust-dix = "0.7"
如果使用过程宏:
[dependencies]
rust-dix = "0.7"
rust-dix-macros = "0.7"
导入约定
> `rust-dix` 已重新导出全部宏与类型,**无需单独依赖 `rust-dix-macros`**。
在每个使用 DI 的文件顶部加两行 use,之后所有宏(`#[inject]`、`#[derive(Inject)]`、`#[module]`、`register!()`)与类型(`ServiceCollection`、`ServiceProvider` 等)均可直接短名引用:
use rust_dix::*;
use std::sync::Arc;
完整导入约定与路径简化对照表详见 [用法指南 · 导入约定](../08-best-practices/usage-guide.md#1-导入约定路径简化)。
第一个 DI 容器
use rust_dix::*;
use std::sync::Arc;
// 定义接口
trait ILogger: Send + Sync {
fn log(&self, msg: &str);
}
// 定义实现
struct ConsoleLogger;
impl ILogger for ConsoleLogger {
fn log(&self, msg: &str) { println!("[LOG] {}", msg); }
}
// 注册并构建容器
let provider = ServiceCollection::new()
.singleton::<dyn ILogger>(|_| Arc::new(ConsoleLogger))
.build()
.unwrap();
// 解析服务
let logger: Arc<dyn ILogger> = provider.get();
logger.log("Hello, rust-dix!");
生命周期快速选择
| 场景 | 生命周期 | |------|---------| | 全局配置、连接池 | Singleton | | 请求上下文、事务 | Scoped | | 无状态轻量服务 | Transient |
异步容器(推荐 Web 应用使用)
当服务需要异步初始化(如数据库连接、Redis 客户端),使用 `build_async()`:
use rust_dix::*;
use std::sync::Arc;
struct DbPool { conn_str: String }
// 异步初始化数据库连接池
let provider = ServiceCollection::new()
.async_singleton(|_| Box::pin(async {
Arc::new(DbPool { conn_str: "pg://localhost".into() })
}))
.build_async()
.await
.unwrap();
// 解析异步服务
let pool: Arc<DbPool> = provider.get_async().await.unwrap();
混合同步与异步注册:
let provider = ServiceCollection::new()
.async_singleton(|_| Box::pin(async { Arc::new(DbPool::new()) }))
.singleton(|_| Arc::new(AppConfig { port: 8080 }))
.scoped(|r| {
let db = r.get::<DbPool>().unwrap();
Arc::new(UserRepository { db })
})
.build_async()
.await
.unwrap();
> **关键规则**:一旦使用 `async_*` 注册,必须调用 `build_async()`。同步 `build()` 会返回 `Err(RdiError::AsyncServiceRequiresBuildAsync)`(0.7+),而不会在后续 sync `get()` 时才 panic。
下一步
从 [安装与依赖配置](installation.md) 开始。