如何使用Hilt自定义组件为接口的多个实现定义入口点



我已经使用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()
}
}

对我来说,问题似乎是您在DIModuleAuthUserDataEntryBridge中为相同的东西定义实现。老实说,我真的不确定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的用法。

相关内容

  • 没有找到相关文章

最新更新