我最近了解到對Guice的AssistedInject擴展,我認爲這將是一個很好的解決方案,我有一些設計問題。不幸的是,這種解決方案似乎僅限於一級輔助注射。這纔是我的問題的解釋 - 假設我們有三類:使用輔助注入創建一個複雜的依賴關係樹
public class AImpl implements A{
@AssistedInject
public AImpl(@Assisted Integer number, B b){
}
}
public class BImpl implements B {
}
public class CImpl implements C {
@AssistedInject
public CImpl(A a){
}
}
工廠接口:
public interface CFactory {
C create(Integer number);
}
和模塊:
public class ABCModule extends AbstractModule {
@Override
protected void configure() {
bind(A.class).to(AImpl.class);
bind(B.class).to(BImpl.class);
install(new FactoryModuleBuilder().implement(C.class, CImpl.class).build(CFactory.class));
}
public static void main(String[] args) {
Guice.createInjector(new ABCModule()).getInstance(CFactory.class).create(123);
}
}
上面的失敗與以下堆棧跟蹤:
線程「主」 com.google.inject.CreationException:Guice 創建錯誤:
1)在stack.AImpl中找不到合適的構造函數。類必須 具有一個(且僅有一個)具有@Inject註釋的構造函數或不具有私有性的零參數構造函數。在 stack.AImpl.class(AImpl.java:12)在 stack.ABCModule.configure(ABCModule.java:14)
2)stack.CImpl具有@AssistedInject構造,但它們都沒有 匹配參數在方法stack.CFactory.create()中。無法 創建AssistedInject工廠。而定位stack.CImpl而 在stack.CFactory.create定位stack.C(CFactory.java:1)在 com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist(Errors.java:435)
2錯誤 在 com.google.inject.internal.InternalInjectorCreator.initializeStatically(InternalInjectorCreator.java:154) 在 com.google.inject.internal.InternalInjectorCreator.build(InternalInjectorCreator.java:106) 在com.google.inject。 Guice.createInjector(Guice.java:95)at com.google.inject.Guice.createInjector(Guice.java:72)at com.google.inject.Guice.createInjector(Guice.java:62)at stack.ABCModule.main(ABCModule.java:21)
這顯然意味着,我想從擴展太多了 - 我希望注射器將內心深處搜索中的關係是不樹搜索的@Assisted依賴。有沒有辦法做這種輔助注射,還是我需要自己實施我的工廠?
這實際上是一個相同的問題,沒有注意到它。不幸的是,它證明沒有簡單的解決方案可用,但無論如何它仍然是一個答案,謝謝。 – macias