Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何注入;“运行时”;依赖关系,如在应用程序启动时不可用的登录用户?_Java_Gwt_Dependency Injection_Guice_Gwt Gin - Fatal编程技术网

Java 如何注入;“运行时”;依赖关系,如在应用程序启动时不可用的登录用户?

Java 如何注入;“运行时”;依赖关系,如在应用程序启动时不可用的登录用户?,java,gwt,dependency-injection,guice,gwt-gin,Java,Gwt,Dependency Injection,Guice,Gwt Gin,我只是不明白: 我在JavaGWT应用程序中使用Gin来进行DI。登录屏幕集成到完整的应用程序窗口中。在用户登录之后,我想将用户对象注入到其他类中,比如我创建的GUI Presenters,因此我相信我有某种运行时依赖性。我该怎么做 我能想到的一个解决办法是: class Presenter { @Inject Presenter(LoggedInUserFactory userFactory) { User user = userFactory.getLoggedInUser

我只是不明白:

我在JavaGWT应用程序中使用Gin来进行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
时,这才会起作用,但实际情况并非如此

还是应该使用全局静态注册表?我只是不喜欢在我的类中有静态依赖的想法


非常感谢您的任何输入。

在用户登录时,使用一个事件来触发事件,而不是向后弯曲DI来提供给用户

如果您必须为此使用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;
  }
}
编辑:要设置用户变量,客户端代码可以通过如下绑定获取UserProvider类的实例:

bind(User.class).toProvider(UserProvider.class);
bind(UserProvider.class).in(Singleton.class);
…这将允许客户端代码执行以下操作:

injector.getInstance(UserProvider.class).user = new User(...)

这个问题跟这个有关,我后来发现的。我想我将重新设计我的应用程序,通过EventBus传递给用户,因为它似乎不适合DI。我不能使用上面提到的第二条路径,因为我的演示者已经初始化了。虽然这可能是重新设计我的应用程序以推迟其他演示者加载的一个选项。这并不好笑,但提供商究竟如何获得用户?空用户并不是这个问题想要的。是的,谢谢你的gpampara。我现在在我的解决方案中添加了一些内容来解决这个问题。