我想使用这里建议的架构构建一个 android 应用程序。然而,在遵循指南并为我的所有课程使用匕首之后,我最终得到了一个循环依赖,总结为
android.app.Application <- (Retrofit) ServerClient <- UserRepository <- UserViewModel <- UserActivity <- somethingsomething <- android.app.Application
更详细的版本在这里:
android-client/app/src/main/java/de/njsm/stocks/android/dagger/RootComponent.java:22: error: [Dagger/DependencyCycle] Found a dependency cycle:
public interface RootComponent extends AndroidInjector<Application> {
^
android.app.Application is injected at
de.njsm.stocks.android.dagger.modules.WebModule.fdsa(a)
android.app.Application is injected at
de.njsm.stocks.android.dagger.modules.WebModule.provideServerClient(ctx)
de.njsm.stocks.android.network.server.ServerClient is injected at
de.njsm.stocks.android.repo.UserRepository(…, webclient, …)
de.njsm.stocks.android.repo.UserRepository is injected at
de.njsm.stocks.android.dagger.modules.ViewModelModule.provideUserViewModel(repo)
java.util.Map<java.lang.Class<? extends androidx.lifecycle.ViewModel>,javax.inject.Provider<androidx.lifecycle.ViewModel>> is injected at
de.njsm.stocks.android.dagger.modules.ViewModelModule.viewModelFactory(providerMap)
androidx.lifecycle.ViewModelProvider.Factory is injected at
de.njsm.stocks.android.frontend.user.UserActivity.setViewModelFactory(viewModelFactory)
de.njsm.stocks.android.frontend.user.UserActivity is injected at
dagger.android.AndroidInjector.inject(T) [de.njsm.stocks.android.dagger.RootComponent → de.njsm.stocks.android.dagger.modules.ActivityModule_ContributeUserActivity.UserActivitySubcomponent]
我明白为什么会出现问题。我的依赖项遵循从后端到前端的方向,在后端的“叶子”处,我需要一个 android 上下文来访问文件系统以加载密钥库和 Room DB。我想知道的是:由于我只是遵循架构布局,我不能成为第一个遇到这种情况的人。我怎样才能打破这个循环?我最喜欢的剪辑是在活动和应用程序之间进行,因为 AFAIU 应用程序可以在没有活动的情况下在 android 中存在。
为了注入活动,我遵循了匕首指南,其余的很简单(并且可以工作)匕首配置。