如何在应用程序启动时注入“登录用户”之类的“运行时”依赖项?

我只是没有得到这个:

我在我的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时才有效,但事实并非如此。

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

非常感谢任何输入。

而不是向后弯曲DI以向用户供电,使用EventBus在用户登录时触发事件。

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

您可以使用Provider接口。

 class Presenter { @Inject Presenter(Provider userProvider) { User user = userProvider.get(); } } class UserProvider implements Provider { 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(...)