2014-10-07 7 views
0

다음과 같이 I 클래스가 있다고 가정 :Guice : 보조 주사와 공급자

public interface ComplicatedFactory { 
    public Complicated build(String assisted); 
} 

인가 그것을 FactoryModuleBuilder를 사용하는 경우, 가능한, 바인딩 : 이제

public class ComplicatedImpl implements Complicated { 
    @Inject 
    public ComplicatedImpl(Integer normal, @Assisted String assisted); 

    public void addListener(Listener listener); 
} 

, 나는 ComplicatedFactory과 같이이 ComplicatedFactory과 같이 build()이 호출 될 때

ComplicatedImpl impl = new ComplicatedImpl(normal, assisted); 
impl.addListener(listener); 
return impl; 

과 대조적으로 새로운 ComplicatedImpl을 직접 반환하는 일반적인 경우는 무엇입니까?

나는 Provider 어떤 형태로 ComplicatedImpl을 결합하는 시도에 걸쳐 있었다, 그러나 나는 그와 함께 빙빙 도는 것 것 같다 ...

답변

1

나는이 Guice 가능하다 생각하지 않는다; FactoryModuleBuilder은 명시 적 생성자 인수와 종속성을 섞는 것 외에는 거의 할 수 없습니다.

public class ListeningComplicatedFactory { 
    @Inject Provider<Integer> normalProvider; 

    public Complicated createComplicated(String assisted, Listener listener) { 
    ComplicatedImpl impl = new ComplicatedImpl(normalProvider.get(), assisted); 

    // If ComplicatedImpl uses member injection, inject an Injector and call 
    // injector.injectMembers(impl) to call @Inject-annotated methods/fields. 

    impl.addListener(listener); 
    return impl; 
    } 
} 

당신이 Complicated 인터페이스에 addListener을 넣어하고자하는 경우, 당신은 또한, ComplicatedFactory를 주입 새로운 인스턴스를 생성하는 래퍼를 작성하는 옵션을 가지고 있고, addListener를 호출 다행히, 수동 공장을 작성하는 것은 상대적으로 쉽다 즉시. 이는 PrivateModule에 ComplicatedFactory를 바인딩 한 다음 새 ComplicatedWrapperFactory 만 노출하여 CompleicatedWrapperFactory를 새로운 복잡한 구현을 생성하는 유일한 방법으로 만드는 경우 특히 효과적 일 수 있습니다.