我只是没有得到这个:

我在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(...)
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top