2

我只是没有得到这个:

我在我的 java GWT 应用程序中使用 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在用户登录后创建的情况下才有效,而事实并非如此。

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

非常感谢任何输入。

4

2 回答 2

2

与其向后弯曲 DI 以提供给用户,不如使用EventBus在用户登录时触发事件。

如果您绝对必须为此使用 DI,并且在使用非空用户正确初始化之前不会使用需要用户的演示者,您可以将调用推迟到GWT.create(MyGinjector.class)用户登录之后。然后您将有两个这样的调用您的应用程序:一个用于登录代码路径,另一个用于应用程序的其余部分。

于 2011-01-07T20:20:00.663 回答
2

您可以使用Provider接口。

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(...)
于 2011-01-08T20:22:30.787 回答