Как ввести зависимость «время выполнения», как зарегистрированная пользователем, которая недоступна при загрузке приложений?

StackOverflow https://stackoverflow.com/questions/4629777

Вопрос

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

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

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

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

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

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

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

Любой вклад очень ценится.

Это было полезно?

Решение

Вместо того, чтобы изгнать ди-обратную сторону, чтобы поставить пользователя, используйте Eventbus. Чтобы выстрелить событие, когда пользователь регистрирует.

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

Другие советы

Вы могли бы использовать Провайдер интерфейс.

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);

РЕДАКТИРОВАТЬ: Чтобы установить пользовательскую переменную, код клиента может получить экземпляр класса USERPROVIDER через подобное привязку:

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

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

injector.getInstance(UserProvider.class).user = new User(...)
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top