背景
根据兄弟姐妹子组件之间的docs依赖关系是不可能的,因此,剩下的另一种方法是组件依赖关系。我试图封装“资源库”类,以便UI只能访问“资源库”的实例,而不能访问“资源库”的实现细节。我的意思是 ApiModule 中的任何内容都不应公开。
ApiModule
@Module
class ApiModule {
@Provides
fun provideConnection(): Connection = //....
}
RepositoryModule
@Module (
includes = [
ApiModule::class
]
)
abstract class RepositoryModule {
@Provides
fun providesRepository(connection Connection): Repository = //.....
}
AppComponent
@Component (modules = [
AppModule::class,RepositoryModule::class
])
interface AppComponent{
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
问题
现在,如果我创建一个 AppComponent 的子组件(比如说 activitySubComponent ),则所有绑定都在 RepositoryModule 和 ApiModule 模块将公开给该子组件。不过,我只想提供“存储库”,即可从 activitySubComponent
访问建议的解决方案
创建 RepositoryComponenet 和 activityComponent 组件使 AppComponenet 成为其依赖项:
AppComponent
@Component (modules = [
AppModule::class
])
interface AppComponent{
@Component.Builder
interface Builder {
@BindsInstance
fun application(application: Application): Builder
fun build(): AppComponent
}
}
activityComponent
@Component(dependencies = [AppComponent::class],modules = [activityModule::class])
interface activityComponent {
fun inject(mainactivity: Mainactivity)
@Component.Builder
interface Builder{
fun appComponent(appComponent: AppComponent): Builder
fun build(): activityComponent
}
}
RepositoryComponent
@Component(dependencies = [AppComponent::class],modules = [RepositoryModule::class])
interface RepositoryComponent {
}
问题是如何将“资源库”实例公开给同级 activityComponent 的绑定,或者将@Inject
公开给Mainactivity?任何解释,更改我的配置的建议或可能解决我问题的文章的链接都将受到赞赏。