You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust Tokio下带依赖反转与泛型的异步代码Send trait报错问题

问题原因
  • Tokio 默认采用多线程运行时,要求所有跨越 await 点的 Future 必须实现 Send trait,才能在线程间安全调度。
  • #[async_trait] 宏生成的异步方法默认返回带 Send 约束的装箱 Future,但这要求 trait 自身的实现满足线程安全要求。
  • 你新增的 IUserRepository 和 IUserGetAllUseCase 两个 trait 定义时没有添加 Send + Sync 约束,当作为泛型约束使用时,编译器无法保证 trait 实现的线程安全性,也无法保证异步方法返回的 Future 满足 Send 要求,因此触发编译错误。
  • 未接入 Repository 层的旧代码没有泛型参数,编译器可以自动推断出 UseCase 实现的线程安全性,所以可以正常编译。
解决方案

仅需要给两个 trait 定义添加上 Send + Sync 约束即可解决问题,其余代码无需修改:

// 修改 Repository trait 定义,添加 Send + Sync 约束
#[async_trait]
pub trait IUserRepository: Send + Sync {
  async fn company_get_all(&self) -> AsyncResult<Vec<User>>;
}

// 修改 UseCase trait 定义,添加 Send + Sync 约束
#[async_trait]
trait IUserGetAllUseCase: Send + Sync {
  fn new<T: IUserRepository>(user_repository: T) -> UserGetAllUseCase<T>;
  async fn execute(&self) -> AsyncResult<Vec<User>>;
}

修改后即可正常编译运行,你也可以根据实际需求选择将 new 方法从 trait 中移出,直接作为 UserGetAllUseCase 结构体的关联函数,简化 trait 定义。

内容的提问来源于stack exchange,提问作者miravelardo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 16:06:02