[英]Guice: Inject a class bound by another module?
我有以下課程:
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圖合並為一個(例如,通過注入Injector並調用createChildInjector ),也幾乎沒有辦法保證在編譯時其他模塊中所需的綁定將存在,因為Module
在運行時有效。 最好的選擇是編寫一個單元測試。 您可以通過調用requireBinding
更快地使失敗,如果在外部無法最終滿足特定的依賴關系,則在創建Injector時將失敗。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.