Dagger Hilt中DoggoApi重复绑定问题修复咨询
解决Hilt中[Dagger/DuplicateBindings]重复绑定DoggoApi的问题
问题根源
DataModule.provideDoggoApi()和NetworkingModule.provideDoggoApi(OkHttpClient)两个@Singleton作用域的方法都提供了DoggoApi实例,Hilt无法确定注入链路中该使用哪个实例,因此抛出重复绑定错误。
解决方案
方案1:移除重复的Provide方法(优先推荐)
模块化项目中应遵循单一职责原则,将网络Api实例的创建统一交给专门的网络模块(比如这里的NetworkingModule),删除DataModule中重复的provideDoggoApi()方法,确保整个项目只有一处提供DoggoApi的单例实例。
示例修改:
删除DataModule中的以下代码:
@Singleton @Provides fun provideDoggoApi(): DoggoApi { // 原DataModule中的Api创建逻辑 }
方案2:使用@Qualifier区分不同实例(需多实例场景)
如果业务确实需要两个不同配置的DoggoApi实例,通过自定义@Qualifier注解来标记不同的绑定,让Hilt明确注入哪个实例。
- 定义Qualifier注解:
@Qualifier @Retention(AnnotationRetention.BINARY) annotation class NetworkingDoggoApi @Qualifier @Retention(AnnotationRetention.BINARY) annotation class DataDoggoApi
- 给两个Provide方法添加对应的Qualifier:
// NetworkingModule @Singleton @NetworkingDoggoApi @Provides fun provideDoggoApi(okHttpClient: OkHttpClient): DoggoApi { return Retrofit.Builder() .client(okHttpClient) .baseUrl("https://your-network-api-url.com/") .build() .create(DoggoApi::class.java) } // DataModule @Singleton @DataDoggoApi @Provides fun provideDoggoApi(): DoggoApi { return Retrofit.Builder() .baseUrl("https://your-data-api-url.com/") .build() .create(DoggoApi::class.java) }
- 在注入时指定Qualifier:
class DoggoRepository @Inject constructor( @NetworkingDoggoApi private val doggoApi: DoggoApi ) { // 业务逻辑实现 }
方案3:调整模块依赖关系
确保Data模块依赖Networking模块,让Data模块直接使用NetworkingModule提供的DoggoApi实例,而非自行创建。这样既避免重复绑定,也符合模块化分层的依赖规范。
内容的提问来源于stack exchange,提问作者JustSightseeing
相关产品推荐
相关产品推荐

