2012-12-26 68 views
1

說我有2個類。在Guice中「繼承」從一個提供者到另一個提供者的註釋

class A { ... } 
class B { 
public B(A a) {...} 
} 

我想創建一個模塊,得到一個名稱,並且需要創建一個用於註釋B結合:

class MyModule extends AbstractModule { 
    String name; 
    public MyModule(String name) { this.name = name; } 

    public void configure() { 
    // CREATE BINDING for @Named(name)B which depends on @Named(name)A 
    } 
} 

什麼是創建對於B結合的最佳方式(或供應商爲它)這取決於正確的A?

感謝 亞龍

回答

0

如何:

bind(B.class).annotatedWith(Names.named("name")).toProvider(new Provider<B>() { 

    private A namedA; 

    @Inject 
    public void setNamedA(@Named("name") A namedA) { 
     this.namedA = namedA; 
    }  

    @Override 
    public B get() { 
     return new B(namedA); 
    } 

}); 

應該根據文檔,雖然我沒有測試它的工作。

+0

這是一個不錯的方法,但我認爲它不能工作。問題是'name'是一個參數所以它不能用作setNamedA參數的註釋 – Yaron

+0

Ops,我沒有考慮到這種情況,在這種情況下,你可以使用方法getInstance(Key)使用Injector來檢索命名的A鍵)。這樣你就可以在Guice中安裝模塊後得到實例。以下是該方法的javadoc:http://google-guice.googlecode.com/svn/trunk/javadoc/com/google/inject/Injector.html#getInstance(com.google.inject.Key ) – izaera

+0

我不'你認爲你可以通過純粹的程序化聲明來實現綁定,因爲你想使用的策略看起來太複雜了,它不能被Guice流暢的界面抽象出來。這就是爲什麼我認爲你必須訴諸某種Guice內部方法(如使用Providers或直接調用Injector) – izaera

0

我本週在different SO thread回答了一個非常類似的問題。

如果你知道你想支持哪個註解,你就可以對每個註釋創建PrivateModule這樣你就可以暴露出@Named("c1") B無論哪裏需要綁定到僅使用@Named("c1") A

install(new PrivateModule() { 
    @Override void configure() { 
    // These are only bound within this module, and are not visible outside. 
    bind(A.class).to(A1.class); 
    // Though you can bind to other bindings which come from outside! 
    bind(B.class).to(Key.get(B.class, Names.named("c1"))); 
    // Now expose the annotated bindings you'd like to expose. 
    bind(C.class).annotatedWith(Names.named("c1")).to(C.class); 
    expose(C.class).annotatedWith(Names.named("c1")); 
    } 
}); 

我不認爲有一種方式說:「對於所有的註釋N,使可@N B使用@N A,因爲吉斯是建立在從(譯註,TypeLiteral)元組供應商看上圖,你要求推斷可能存在也可能不存在的依賴關係圖中的元組。

+0

不幸的是,我並不知道所有的註釋。 但我認爲這是可以添加的東西。某種形式的「從另一個綁定繼承註釋」的方式。 – Yaron

相關問題