Циклическая зависимость GWT GIN

Вот пример, который у меня есть -

public class GinDemoPresenter implements Presenter {

   private View view;

   @Inject
   public GinDemoPresenter (View view) {
      this.view = view;
   }
   ....
}

public class GinDemoView implements View {

   private Presenter presenter;

   @Inject
   public GinDemoView(Presenter presenter) {
      this.presenter = presenter;
   }
   ....
}

Во время компиляции я вижу это -

...
Cycle detected in the dependency graph.  Consider using a Provider?
...

Может ли кто-нибудь привести пример того, как разрешить циклическую зависимость в GIN?


person ankurvsoni    schedule 06.12.2013    source источник


Ответы (1)


Самый простой способ - следующий шаблон:

public class GinDemoPresenter implements Presenter {

   private View view;

   @Inject
   public GinDemoPresenter (View view) {
      this.view = view;
      view.setPresenter(this);
   }
   ....
}

public class GinDemoView implements View {

   private Presenter presenter;

   public GinDemoView() {
   }

   public void setPresenter(Presenter presenter){
      this.presenter = presenter;
   }
   ....
}

Я бы предложил отделить View от Prensenter, введя интерфейсы.

person Christian Kuetbach    schedule 06.12.2013
comment
Но когда я пытаюсь использовать представление, т.е. View view = new GinDemoView(); Ведущий не будет введен автоматически, верно? - person ankurvsoni; 06.12.2013
comment
Как только вы new объект, вы отказываетесь от внедрения зависимостей (если вы позже явно не внедрите члены) - person Thomas Broyer; 06.12.2013
comment
Извините, я хотел сказать, если я сделаю что-то вроде - Injector.getView() (который возвращает GinDemoView). По сути, то, что я хочу сделать, это, внедрив представление, я хочу внедрить ведущего в представление. - person ankurvsoni; 07.12.2013
comment
Но вы не можете вводить экземпляр A.class в B.class И одновременно вводить экземпляр B.class в A.class. Это тоже нельзя сделать руками, без ДИ. - person Christian Kuetbach; 07.12.2013
comment
Вот почему ошибка предлагает использовать Provider. Вы можете безопасно внедрять Provider‹Presenter› и Provider‹View› в конструкторы друг друга; если вы вызовете их внутри конструкторов, вы войдете в бесконечную рекурсию, но если вы сохраните Provider как поле и отложите доступ, вы можете безопасно разорвать цепочку рекурсии. - person Ajax; 07.12.2013
comment
Если вы думаете об этом, с вашим конструктором как есть, как можно было бы создать любой объект без DI? Внедрение зависимостей должно по-прежнему подчиняться законам линейного выполнения; он просто генерирует для вас код подключения. Если вы не можете закодировать ситуацию самостоятельно, DI также не сможет закодировать ее за вас. - person Ajax; 07.12.2013