我已经使用Hilt创建了一个自定义组件AuthUserComponent
,并且需要为DataRepository
接口提供多个实现。
class Sample @Inject constructor(
@DemoMode private val demoRepository: DataRepository,
@ProductionMode private val productionRepository: DataRepository
) {}
我已经创建了以下@提供接口的实现:
Module
@InstallIn(AuthUserComponent::class)
object DIModule {
@AuthUserScope
@DemoMode
@Provides
fun provideDataRepositoryImplDemo(): DataRepository =
DataRepositoryImplDemo()
@AuthUserScope
@Provides
@ProductionMode
fun provideDataRepositoryImpl(): DataRepository =
DataRepositoryImpl()
}
如何通过Entrypoint提供多个存储库实现,并将其与SingletonComponent桥接?我得到以下错误:
DataRepository绑定多次错误
@InstallIn(AuthUserComponent::class)
@EntryPoint
interface AuthUserDataEntryPoint {
@ProductionMode
fun dataRepositoryImpl(): DataRepository
@DemoMode
fun dataRepositoryImplDemo(): DataRepository
}
@Module
@InstallIn(SingletonComponent::class)
internal object AuthUserDataEntryBridge {
@DemoMode
@Provides
internal fun provideDataRepositoryImplDemo(
authUserComponentManager: AuthUserComponentManager
): DataRepository {
return EntryPoints
.get(authUserComponentManager, AuthUserDataEntryPoint::class.java)
.dataRepositoryImplDemo()
}
@ProductionMode
@Provides
internal fun provideDataRepositoryImpl(
authUserComponentManager: AuthUserComponentManager
): DataRepository {
return EntryPoints
.get(authUserComponentManager, AuthUserDataEntryPoint::class.java)
.dataRepositoryImpl()
}
}
对我来说,问题似乎是您在DIModule
和AuthUserDataEntryBridge
中为相同的东西定义实现。老实说,我真的不确定AuthUserDataEntryBridge
的用途是什么,而且我不熟悉在用@Module
注释的类中使用EntryPoints
。
有没有原因你不能直接在SingletonComponent
中安装这个:
Module
@InstallIn(SingletonComponent::class)
object DIModule {
@DemoMode
@Provides
fun provideDataRepositoryImplDemo(): DataRepository =
DataRepositoryImplDemo()
@Provides
@ProductionMode
fun provideDataRepositoryImpl(): DataRepository =
DataRepositoryImpl()
}
这似乎是这里问题的核心。我猜这是因为自定义组件/范围。在这种情况下,我认为您只需要在实际注入存储库的地方使用EntryPoints
:
class Sample {
private lateinit var demoRepository: DataRepository
private lateinit var productionRepository: DataRepository
fun inject(authUserComponent: AuthUserComponent) {
val entryPoint = EntryPoints.get(authUserComponent, AuthUserDataEntryPoint:class.java)
demoRepository = entryPoint.demoRepositoryImpl()
productionRepository = entryPoint.productionRepositoryImpl()
}
}
但我不认为您会试图在模块定义中隐藏EntryPoints
的用法。