项目一大,AppState 往往不只一个字段。
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)
}这就像:
总关底册 AppState
├── 数据库分册 db
└── 配置分册 config窗口不一定每次都把整本底册搬上桌。
它只拿自己需要的那一本分册。
这是 Axum 很漂亮的一点:
共享状态不是一坨全局单例,而是可以被类型化切开的。