我对Dagger2还是很陌生,在使用它时遇到了一些麻烦。
因此,假设我有四个项目模块(app
,data
和domain
)
domain
具有业务逻辑(供app
使用的交互器)和一些接口,供data
实现
app
应该进行布线,因此它应该向domain
提供data
提供的接口实现,并且应该从中接收交互器
我想做这些接线而不暴露任何这些模块的内部图,例如:
data
模块实现了Repository
提供的domain
接口,并且在内部使用CloudRepository
和LocalRepository
创建它,我不会不想让其他项目模块知道这两个存储库的存在,它们应该只知道Repository
的实现:/* domain */
interface Interactor
interface Repository
class InteractorImpl(repository: Repository): Interactor
/* data */
interface LocalRepository
class LocalRepositoryImpl : LocalRepository
interface CloudRepository
class CloudRepositoryImpl : CloudRepository
class RepositoryImpl(local: LocalRepository, cloud: CloudRepository) : Repository
我最初的想法是使用Component依赖关系,所以我为每个项目模块创建了一个Component,它仅向我公开需要的内容(RepositoryImplDaggerModule
仅使用data
,{{1 }})和domain
组件将取决于它们:
app
乍看之下看起来很完美,但是当我单击构建时,由于/* domain */
@Module
class InteractorModule {
@Provides
fun provideInteractor(repository: Repository): Interactor = InteractorImpl(repository)
}
@Module
class FilterModule {
@Provides
fun provideFilter(): Filter = FilterImpl()
}
@Component(modules = [InteractorModule::class, FilterModule::class])
class DomainComponent {
fun interactor: Interactor //only expose this
}
/* data */
@Module
class LocalRepositoryModule {
@Provides
fun provideLocalRepository(): LocalRepository = LocalRepositoryImpl()
}
@Module
class CloudRepositoryModule {
@Provides
fun provideCloudRepository(): CloudRepository = CloudRepositoryImpl()
}
@Module
class RepositoryModule {
@Provides
fun provideRepository(local: LocalRepository, cloud: CloudRepository): Repository = RepositoryImpl(local, cloud)
}
//should be able to depend on DomainComponent if needed
@Component(modules = [LocalRepositoryModule::class, CloudRepositoryModule::class, RepositoryModule::class])
class DataComponent {
fun repository: Repository //only expose this
}
/* app */
@Component(dependencies = [DomainComponent::class, DataComponent::class])
class AppComponent
是DomainComponent
存储区的实现而收到错误消息,Dagger2不允许我这样做
创建不完整的组件。
关于类似问题的一些SO建议是使用incomplete (it needs to know about the
,但它们公开了整个图形,我认为他们无法为父级Subcomponents
提供依赖项(提供Component
这种情况下的互动者。)
其他建议是将app
和DomainComponent
替换为Modules并使用DataComponent
,但是再一次,它们公开了包含Modules的整个图形。
所以我有点卡在这里,我希望我的应用程序的下层(inculdes
和data
)通过domain
组件交换依赖关系,同时提供{{1} }具有交互器的组件,并且还隐藏其内部图。
谢谢!