我有一个模块,它使用一个标志来决定是否安装另一个模块。有没有办法通过注入(inject)来实现这一点,或者我是否需要在构造函数中显式传递标志的值?
public class MyModule implements Module {
private final Boolean shouldInstallOtherModule;
@Inject public MyModule(Boolean shouldInstallOtherModule) {
this.shouldInstallOtherModule = shouldInstallOtherModule;
}
public void configure() {
if(shouldInstallOtherModule) {
install(SomeOtherModule);
}
}
}
最佳答案
虽然可以注入(inject)模块,或者从注入(inject)器获取模块,但最好的设计决策是:模块可以以有限的方式访问自己的注入(inject)器,因此模块上的 @Inject
方法和字段引入了第二个注入(inject)器,这可能很快就会变得困惑。
在这种情况下,我会单独为配置创建一个注入(inject)器,然后 create a child injector以及基于该配置的模块。您的模块应该负责配置绑定(bind),而不是选择要安装哪些其他模块 - 这是最好留给根应用程序的工作。
如果您觉得必须将条件安装保留在模块中,只需将配置值直接作为构造函数参数,然后让您的顶级对象(创建注入(inject)器)提供它它需要。这将防止两个注入(inject)器同时在同一个对象实例中处于 Activity 状态,这使得一切都更容易理解。
对于类似的问题和解决方案,请参阅这个SO问题:"Accessing Guice injector in its Module?"
关于java - 是否可以为模块注入(inject)值(value),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30051449/