如何像在应用程序启动时间无法使用的用户一样注入“运行时”依赖关系?
-
08-10-2019 - |
题
我只是没有得到这个:
我在Java GWT应用程序中使用Gin进行DI。登录屏幕集成到完整的应用程序窗口中。用户登录后,我想将用户对象注入我创建的其他类,例如GUI主持人,因此我相信我有某种运行时依赖性。我怎么做?
我能想到的一种解决方案是STH,例如:
class Presenter {
@Inject
Presenter(LoggedInUserFactory userFactory) {
User user = userFactory.getLoggedInUser();
}
}
class LoggedInUserFactoryImpl {
public static User user;
User getLoggedInUser() {
return user;
}
}
因此,当用户成功登录时,我有一个对象,我将静态属性设置在 LoggedInUserFactory
, ,但这只有在 Presenter
在用户记录并非如此之后创建。
还是我应该使用全球静态注册表?我只是不喜欢在课堂上拥有静态依赖性的想法。
任何输入都非常感谢。
解决方案
而不是向后弯曲DI以提供用户,而是使用 EventBus 在用户登录时发射事件。
如果您绝对必须使用di和需要用户的主持人,直到与非NULL用户适当初始初始初始初始初始化,您可以将您的呼叫推迟到 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(...)
不隶属于 StackOverflow