2012-07-18 3 views
3

이 예제는 Dependency Injection에 대한 책에서 가져온 것입니다.Guice 부분 주입 예

87 페이지에이 예제가 있습니다.

public class NewsletterManager { 
    private final List<Recipient> recipients; 
    private final DelivererFactory factory; // The book notes this as injected 

    public NewsletterManager(List<Recipient> rs, DelivererFactory factory) { 
    this.recipients = rs; 
    this.factory = factory; 
    } 

    public void send(Newsletter letter) { 
    for (Recipient recipient : recipients) { 
     Deliverer d = factory.forLetter(letter); 
     d.deliverTo(recipient); 
    } 
    } 

} 

나는 코드가 할 무엇을 의미하는지 이해하지만, 내가 이해하지 못하는 것은 내가이 클래스의 인스턴스를 만들 수 있도록, 실체화, 또는 내 Module을 구성하는 방법입니다.

DelivererFactory이 주입 된 것으로 보입니다. 예제는 어떻게 말하지는 않지만, 생성자 주입을 통한 것임을 인정합시다. 이 경우 NewsletterManager 인스턴스에 특정적인 List<Recipient> 인스턴스를 전달하는 방법은 무엇입니까? Guice를 사용하여 모듈 DelivererFactory과 특정 List<Recipient> 인스턴스를 구성한 NewsletterManager을 인스턴스화하는 방법은 무엇입니까?

내가 얻지 못하는 것은 동시에 생성자의 서명에 개체와 인스턴스 특정 개체를 동시에 삽입 할 수있는 방법입니다. 이 경우 만 가지고 NewsletterManager의 인스턴스를 얻을 수있는 방법이 표시되지 않습니다. 나는 공장에 의지해야합니까? 내가 너무 내 공장에 주입해야하기 때문에이 경우, 내 질문은 충분히 명확 바랍니다

...

답변

6

자네 말이 맞아 ...의 DelivererFactory 주사를 사용하는 것입니다, 이런 종류의 주사는 공장을 통해서만 해결 될 수 있습니다.

당신이 주입 B 런타임에 전달되는으로 Foo(A a, B b)이있는 경우, 내부적으로

다행히, Guice는 @Assisted 주입의 개념이 A.

에 대한 참조를 보관 유지하는 공장 FooFactory.createFoo(B b)가 필요합니다. 공장의 인터페이스를 제공해야하지만 Guice에게 구현의 "마법"을 남길 수 있습니다.

그것의 꽤 잘 설명 :

을 guice 보조-주입 https://github.com/google/guice/wiki/AssistedInject

당신은»com.google.inject.extensions에 추가 종속성이 필요합니다

관련 문제