2013-09-30 4 views
1

클래스 A를 GIN 어딘가에 주입하고 싶습니다. 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의 인스턴스 팩토리를 사용하기 위하여는 A의 생성자를 수정 요구와 C이다 GIN을 사용하고 A 생성자의 상용구 코드를 피하십시오?

답변

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

이 내가 다른 식별자를 가진 다른 인스턴스를 생성 할 경우에도 작동 ? – Fedy2

+1

예, 이전에 A의 새 인스턴스를 생성하려면 '제공자'에게 제공해야하는 다음 ID를 알려 주어야합니다. 예를 들어'MyModule.nextId = "what anything";와 같은 정적 인 방식으로; –

+0

테스트를 거쳐 정상적으로 작동합니다. – Fedy2

관련 문제