Как ввести зависимость «время выполнения», как зарегистрированная пользователем, которая недоступна при загрузке приложений?
-
08-10-2019 - |
Вопрос
Я просто не понимаю это:
Я использую 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(...)