如何在应用程序启动时注入“登录用户”之类的“运行时”依赖项?
我只是没有得到这个:
我在我的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(...)
- 为什么在CDI中使用构造函数而不是setter注入?
- 获得相同类型的多个guice单身人士
- 在Guice注入一家通用工厂
- Guice:Singleton.class和@Singleton之间的差异
- Guice:可以注入模块吗?
- 如何在Play中的静态方法中使用play.cache.CacheApi! 框架2.4.2
- 什么时候在Spring中使用javax.inject.Provider?
- 在websphere共享库中使用CDI
- Jersey2,Hk2dependency injection(自动)给出AbstractMethodError:org.jvnet.hk2.internal.DynamicConfigurationImpl.addIdempotentFilter