Rust Tokio下带依赖反转与泛型的异步代码Send trait报错问题
问题原因
- Tokio 默认采用多线程运行时,要求所有跨越 await 点的 Future 必须实现
Sendtrait,才能在线程间安全调度。 #[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
相关产品推荐
相关产品推荐

