WAE Effect - 代数效应风格的依赖注入模块
提供声明式的依赖获取能力,通过 Effectful 参数统一管理所有依赖。
设计理念
传统模式需要在函数签名中声明所有依赖:
async fn handler(
State(db): State<Database>,
State(cache): State<Cache>,
Extension(user): Extension<AuthenticatedUser>,
) { ... }
代数效应模式通过单一参数统一管理:
async fn handler(e: Effectful) {
let db = e.use_database().await?;
let user = e.use_auth().await?;
}
优势
- 声明式: 依赖在函数体内按需获取
- 类型安全: 编译时检查依赖类型
- 可测试: 轻松 mock 依赖
- 组合性: 依赖可以嵌套组合
代数效应模块 - 提供依赖注入和代数效应系统。
主要功能
- 依赖注入: 类型安全的依赖管理
- 代数效应: 函数式编程风格的副作用处理
- 上下文管理: 请求上下文传递
- 组合式 API: 链式构建依赖容器
核心概念
AlgebraicEffect - 效应构建器
Dependencies - 依赖容器
Effectful - 效应执行器
使用示例
use wae_effect::{AlgebraicEffect, Dependencies, Effectful};
use serde::Deserialize;
#[derive(Debug, Clone, Deserialize)]
struct AppConfig {
app_name: String,
version: String,
}
#[derive(Debug, Clone)]
struct User {
id: String,
username: String,
}
#[tokio::main]
async fn main() {
let deps = AlgebraicEffect::new()
.with_config(AppConfig {
app_name: "My App".to_string(),
version: "1.0.0".to_string(),
})
.with_auth(User {
id: "001".to_string(),
username: "admin".to_string(),
})
.build();
let config = deps.get::<AppConfig>()?;
let user = deps.get::<User>()?;
}
在 Axum 中使用
use axum::Router;
use wae_effect::Effectful;
async fn handler(ae: Effectful) -> Result<Json<Response>, EffectError> {
let config = ae.use_config::<AppConfig>().await?;
let user = ae.use_auth::<User>().await?;
Ok(Json(Response { user }))
}
let app = Router::new()
.route("/api", get(handler))
.with_state(deps);