2013-09-30 32 views
1

我想用GIN在某處注入類A。 A類構造函數需要一個在運行時知道的id和另外兩個類B和C.B和C構造函數需要與參數A相同的ID。如何在使用GIN注入時傳播值

這裏是一個類的例子。

public class A { 
    @Inject 
    public A(String id, B b, C c) 
    { 
    ... 
    } 
} 

public class B { 
    @Inject 
    public B(String id) 
    { 
    ... 
    } 
} 

public class C { 
    @Inject 
    public C(String id) 
    { 
    ... 
    } 
} 

如何在注入期間將ID傳播到所有類?

一種解決方案是使用一個AssistedInjectionFactory具有用於所有三個類創建方法,但是這需要修改一個構造函數,以使用工廠來實例B和C

還有其他的方法來使用GIN並避免構造函數的樣板代碼?

回答

3

我會用@Named註釋,並根據你想如何計算的id值,該bindConstant方法或Provider

... 
@Inject public A(@Named("myId") String id, B b, C c) 
... 
@Inject public B(@Named("myId") String id) 
... 
@Inject public C(@Named("myId") String id) 


public class MyModule extends AbstractGinModule { 

    protected void configure() { 
    // You can use bindConstant and compute the id in configure() 
    String myid = "foo_" + System.currentTimeMillis(); 
    bindConstant().annotatedWith(Names.named("myId")).to(myId) 
    } 

    // Or you can use a provider to compute your Id someway 
    @Provides @Named("myId") public String getMyId() { 
    return "bar_" + System.currentTimeMillis(); 
    }  

} 
+0

這個作品也,如果我要創建具有不同ID的不同實例? – Fedy2

+1

是的,以前要創建A的新實例,您必須對「提供者」說一聲,它必須提供的下一個ID是什麼。例如以'MyModule.nextId =「任意」的靜態方式;' –

+0

經過測試並正常工作。 – Fedy2