Dagger2不完整的组件依赖性

时间:2019-08-02 07:32:13

标签: java android kotlin dagger-2

我对Dagger2还是很陌生,在使用它时遇到了一些麻烦。

因此,假设我有四个项目模块(appdatadomain

  • domain具有业务逻辑(供app使用的交互器)和一些接口,供data实现

  • app应该进行布线,因此它应该向domain提供data提供的接口实现,并且应该从中接收交互器

    < / li>

我想做这些接线而不暴露任何这些模块的内部图,例如:

  • 如果data模块实现了Repository提供的domain接口,并且在内部使用CloudRepositoryLocalRepository创建它,我不会不想让其他项目模块知道这两个存储库的存在,它们应该只知道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这种情况下的互动者。)

其他建议是将appDomainComponent替换为Modules并使用DataComponent,但是再一次,它们公开了包含Modules的整个图形。

所以我有点卡在这里,我希望我的应用程序的下层(inculdesdata)通过domain组件交换依赖关系,同时提供{{1} }具有交互器的组件,并且还隐藏其内部图。

谢谢!

0 个答案:

没有答案