Как внедрить зависимость во время выполнения, например, вошедший в систему пользователь, который недоступен во время загрузки приложения? - PullRequest
2 голосов
/ 07 января 2011

Я просто не понимаю:

Я использую Gin в своем Java-приложении GWT для DI. Экран входа в систему интегрирован в полное окно приложения. После того, как пользователь вошел в систему, я хочу внедрить пользовательский объект в другие классы, такие как GUI Presenters, которые я создаю, поэтому у меня есть какая-то зависимость во время выполнения, я считаю. Как мне это сделать?

Одно из решений, которое я могу придумать, это как:

class Presenter {
  @Inject
  Presenter(LoggedInUserFactory userFactory) {
     User user = userFactory.getLoggedInUser();
  }
}

class LoggedInUserFactoryImpl {
  public static User user;
  User getLoggedInUser() {
    return user;
  }
}

Итак, когда пользователь успешно вошел в систему и у меня есть объект, я установил статическое свойство в LoggedInUserFactory, но это будет работать, только если Presenter создается после того, как пользователь вошел в систему, что не так. .

Или я должен использовать глобальный статический реестр? Мне просто не нравится идея иметь статические зависимости в моих классах.

Любой вклад приветствуется.

Ответы [ 2 ]

2 голосов
/ 08 января 2011

Вы можете использовать интерфейс Provider .

class Presenter {
  @Inject
  Presenter(Provider<User> userProvider) {
     User user = userProvider.get();
  }
}

class UserProvider implements Provider<User> {
  public User user;
  User get() {
    return user;
  }
}

Тогда ваш модуль будет иметь привязку провайдера , например:

bind(User.class).toProvider(UserProvider.class);

EDIT: Чтобы установить пользовательскую переменную, клиентский код может получить экземпляр класса UserProvider через привязку, подобную этой:

bind(UserProvider.class).in(Singleton.class);

... что позволит клиентскому коду сделать это:

injector.getInstance(UserProvider.class).user = new User(...)
2 голосов
/ 07 января 2011

Вместо того, чтобы сгибать DI назад для обеспечения пользователя, используйте EventBus , чтобы инициировать событие, когда пользователь входит в систему.

Если вам абсолютно необходимо использовать DI для этого, а докладчики, для которых требуется Пользователь, не используются до тех пор, пока не будут правильно инициализированы с ненулевым пользователем, вы можете отложить ваш вызов на GWT.create(MyGinjector.class) до тех пор, пока пользователь не войдет в систему. затем сделайте два таких вызова в вашем приложении: один для пути кода входа в систему и второй для остальной части приложения.

...