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

Rust用泛型与依赖倒置实现整洁架构时泛型推断报错如何解决

问题根源

你遇到的泛型推导错误是因为IGetUsersUseCase trait的设计不合理:你将结构体的构造函数new定义在了trait中,且trait内的new方法又声明了独立于impl块泛型的参数K,导致调用GetUsersUseCase::new时,编译器无法建立impl块泛型T和参数K的关联,无法推导GetUsersUseCase<T>的具体类型。

最优解决方案

构造函数是具体结构体的固有行为,不需要抽象到trait中,trait只需定义核心的业务行为execute即可,调整用例层代码如下:

// USE CASE
// trait仅抽象核心业务行为
trait IGetUsersUseCase {
  fn execute(&self) -> Vec<User>;
}

struct GetUsersUseCase<T> {
  // 字段保持私有即可
  user_repo: T,
}

// 固有实现块单独放构造函数
impl<T: IUserRepository> GetUsersUseCase<T> {
  fn new(user_repo: T) -> Self {
    GetUsersUseCase { user_repo }
  }
}

// 实现trait的核心业务逻辑
impl<T: IUserRepository> IGetUsersUseCase for GetUsersUseCase<T> {
  fn execute(&self) -> Vec<User> {
    self.user_repo.get_users()
  }
}

调整后你原有main函数的代码不需要做任何修改,既不需要暴露私有字段,也能正常编译运行,同时也完全保留了依赖倒置的架构设计:controller层仍然只依赖IGetUsersUseCase trait,不与具体的用例实现耦合。

可选方案(不推荐)

如果你确实需要在trait中定义构造函数,可以将trait调整为带关联类型的实现,但这种写法不符合Rust的常规设计习惯,也没有实际收益:

trait IGetUsersUseCase {
  type Repo: IUserRepository;
  fn new(repository: Self::Repo) -> Self;
  fn execute(&self) -> Vec<User>;
}

impl<T: IUserRepository> IGetUsersUseCase for GetUsersUseCase<T> {
  type Repo = T;
  fn new(repository: T) -> Self {
    GetUsersUseCase { user_repo: repository }
  }
  fn execute(&self) -> Vec<User> {
    self.user_repo.get_users()
  }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 11:54:04