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
相关产品推荐
相关产品推荐

