Dagger дает циклическую зависимость при использовании рекомендуемой архитектуры - PullRequest
2 голосов
/ 07 мая 2019

Я хочу создать приложение для Android, используя предложенную архитектуру здесь .Однако после следования руководству и использования кинжала для всех моих классов я получил циклическую зависимость, обобщенную как

android.app.Application <- (Retrofit) ServerClient <- UserViewpository <- UserViewModel <- UserActivity <- somethingsomething<- android.app.Application </p>

Более подробная версия находится здесь:

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.

Чтобы внедрить действия, я следовал руководству по кинжалу , а остальное просто (ирабочий) конфиг кинжала.

...