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

在UseCase构造函数注入CartonRepository接口时遇依赖注入错误

解决Dagger注入CartonRepository时的报错问题

首先,咱们先把这个报错的根源说清楚:Dagger不知道该如何创建CartonRepository接口的实例。Dagger是静态编译型的依赖注入框架,它没办法自动推断接口对应的具体实现类,必须咱们明确告诉它用哪个类来实现这个接口,并且提供实例的创建规则。

你的问题场景回顾

你先定义了一个数据层接口:

interface CartonRepository { 
    fun addToCart(company: Company): Completable 
}

接着在UseCase中注入了这个接口作为依赖:

class ObserveCartonItemSelectionUseCase @Inject constructor(
    private val cartonRepository: CartonRepository
) : ObservableUseCase<UUID, Boolean> { }

当你在其他类中注入这个UseCase时,就出现了以下报错:

ApplicationComponent.java:13: error: CartonRepository cannot be provided without an @Provides-annotated method. public abstract void inject(@org.jetbrains.annotations.NotNull()

具体解决步骤

1. 先给接口写一个具体的实现类

首先得为CartonRepository创建一个实现类,比如CartonRepositoryImpl,如果这个实现类本身需要依赖其他对象,记得给它的构造函数加上@Inject注解:

// 示例实现类,你可以根据业务需求补充具体逻辑
class CartonRepositoryImpl @Inject constructor(
    // 如果需要依赖其他类(比如数据库DAO),可以在这里添加参数
) : CartonRepository {
    override fun addToCart(company: Company): Completable {
        // 这里写实际的业务逻辑,比如操作本地数据库或者发起网络请求
        return Completable.complete() // 示例返回完成状态,你可以替换成真实逻辑
    }
}

2. 在Dagger Module中绑定接口与实现

接下来要告诉Dagger:当需要CartonRepository类型的实例时,就提供CartonRepositoryImpl的实例。这里有两种常用方式:

方式一:用@Binds(推荐,编译时更高效)

创建一个抽象的Module类,用@Binds注解来完成接口与实现类的绑定:

@Module
abstract class RepositoryModule {
    @Binds
    abstract fun bindCartonRepository(
        cartonRepositoryImpl: CartonRepositoryImpl
    ): CartonRepository
}

注意:使用@Binds的前提是,实现类的构造函数必须被@Inject标记,这样Dagger才能自动创建它的实例。

方式二:用@Provides(适合需要手动初始化实例的场景)

如果你的实现类需要手动初始化(比如要传入一些动态参数),可以用@Provides注解:

@Module
class RepositoryModule {
    @Provides
    fun provideCartonRepository(): CartonRepository {
        // 这里可以手动创建实例,或者传入必要的依赖项
        return CartonRepositoryImpl()
    }
}

3. 将Module添加到Dagger Component中

最后,确保你的ApplicationComponent(或者你项目中使用的其他Component)包含了这个Module:

@Component(modules = [RepositoryModule::class])
interface ApplicationComponent {
    // 保留你原本的inject方法
    fun inject(targetClass: YourTargetClass)
}

完成以上三步后,Dagger就能正确找到CartonRepository的实例提供方式,这个报错也就解决啦。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:50:44