我有以下课程:
public class CacheModule extends AbstractModule {
@Override
protected void configure() {
bindConstant().annotatedWith(Names.named(TIMEOUT")).to(60);
// ...etc.
}
}
public class DefaultCacheAdaptor implements CacheAdaptor {
private CacheModule bootstrapper = new CacheModule();
@Named("TIMEOUT") private int timeout;
// other fields omitted for brevity
public DefaultCacheAdaptor() {
super();
Injector injector = Guice.createInjector(bootstrapper);
@Named("TIMEOUT") int t = injector.getInstance(Integer.class);
setTimeout(t);
}
}
public class QueueModule extennds AbstractModule {
@Override
public void configure() {
bind(CacheAdaptor.class).to(DefaultCacheAdaptor.class);
}
}
public class DefaultQueueAdaptor implements QueueAdaptor {
private QueueModule bootstrapper = new QueueModule();
private CacheAdaptor cacheAdaptor;
public DefaultQueueAdaptor() {
super();
Injector injector = Guice.createInjector(bootstrapper);
setCacheAdaptor(injector.getInstance(CacheAdaptor.class));
}
}
CacheModule
/ CacheAdaptor
/ DefaultCacheAdaptor
与QueueModule
/ QueueAdaptor
/ DefaultQueueAdaptor
位于不同的JAR中,因此,后者(在运行时)显然取决于前一个JAR。这样编写代码的目的是允许
CacheModule
在用户编写以下内容时将DefaultCacheAdaptor
整个对象图升压/注入:CacheAdaptor cacheAdaptor = new DefaultCacheAdaptor();
同上
QueueAdaptor
。恰好是
QueueAdaptor
被注入了CacheAdaptor
。但是,
DefaultCacheAdaptor
是其自己的对象树的“根”,并且应始终由CacheModule
注入。所以我问:如何从
DefaultCacheAdaptor
内部将CacheAdaptor
绑定到QueueModule
,但是要确保DefaultCacheAdaptor
本身是由CacheModule
初始化/引导的?提前致谢! 最佳答案
坦白地说,听起来这个问题实际上不是Guice的问题,而是整个软件工程中的标准问题:确保您的依赖项按照他们的要求去做。 QueueModule不必担心DefaultCacheAdaptor是否遵守其一般合同。而是为DefaultCacheAdaptor编写一个单元测试,以确保它会自行引导,然后无需考虑即可在QueueModule中使用它。
这尤其如此,因为DefaultCacheAdaptor具有完全不相关的注入器树。您应该能够不透明地使用DefaultCacheAdaptor,并停止将QueueAdaptor及其实现详细信息纳入考虑范围。它的引导程序是其实现的一部分,而不是其API。
即使您将两个Injector图合并为一个(例如,通过injecting the Injector并调用createChildInjector),也几乎没有办法保证在编译时其他模块中所需的绑定将存在,因为Module
在运行时的工作。最好的选择是编写一个单元测试。您可以通过调用requireBinding
更快地失败,如果在外部无法最终满足特定的依赖关系,则会在创建Injector时失败。
关于java - 吉斯:注入(inject)另一个模块绑定(bind)的类吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18599564/