全书目录

第三十九篇:Axum 完全指南 —— Rust 类型关口宇宙

第九章:State 的进一步组织 —— 总关底册可以拆成分册

1 分钟 103 字 第 755 / 962 个阅读单元

项目一大,AppState 往往不只一个字段。

rust
use axum::extract::{FromRef, State};

#[derive(Clone)]
struct DbPool;

#[derive(Clone)]
struct AppConfig {
    service_name: String,
}

#[derive(Clone)]
struct AppState {
    db: DbPool,
    config: AppConfig,
}

impl FromRef<AppState> for DbPool {
    fn from_ref(state: &AppState) -> Self {
        state.db.clone()
    }
}

impl FromRef<AppState> for AppConfig {
    fn from_ref(state: &AppState) -> Self {
        state.config.clone()
    }
}

async fn health(State(config): State<AppConfig>) -> String {
    format!("{} OK", config.service_name)
}

这就像:

text
总关底册 AppState
├── 数据库分册 db
└── 配置分册 config

窗口不一定每次都把整本底册搬上桌。

它只拿自己需要的那一本分册。

这是 Axum 很漂亮的一点:

共享状态不是一坨全局单例,而是可以被类型化切开的。