2013-05-27 42 views
0

我最近了解到對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依賴。有沒有辦法做這種輔助注射,還是我需要自己實施我的工廠?

回答

0

您的代碼有幾個問題。你需要注入一個「A」到「C」,但您的工廠設注入整數

public interface CFactory { 
    C create(Integer number); 
} 

此外,我不認爲這是由吉斯提供的@AssistedInject註解。改爲在構造函數上使用@Inject,並標記要傳入的參數@Assisted

+0

它沒有問題(除非在Guice中這樣做基本上是不可能的)。 A和B應該由Guice自動注入,而我想獲得一個工廠,該工廠使用Integer參數(由Guice應用於構造函數)對整個類系統進行參數化。是的,有@AssistedInject註釋[文檔](http://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/assistedinject/AssistedInject.html),否則堆棧跟蹤看起來有點不同。 – macias

+0

我看到了,你希望整數被傳遞到最近的依賴項,我猜是需要它的。你的構造函數需要一個「A」,你的工廠正在傳遞一個「整數」,所以我解釋了一個錯誤,如果這不是你的意思。 – Joseph

相關問題