2013-05-27 2 views
0

최근 Guice에 AssistedInject 확장 기능에 대해 알게되었습니다.이 기능은 내가 갖고있는 설계 문제에 대한 좋은 해결책이 될 것입니다. 불행하게도이 솔루션은 단지 한 단계 보조 주입으로 제한됩니다. - 여기 내 문제의 그림을 제공의 우리가 세 가지 클래스가 있다고 가정 해 봅시다 :보조 주입을 사용하면 복잡한 종속성 트리가 생성됩니다.

public class AImpl implements A{ 

    @AssistedInject 
    public AImpl(@Assisted Integer number, B b){ 

    } 
} 

public class BImpl implements B { 

} 

public class CImpl implements C { 
    @AssistedInject 
    public CImpl(A a){ 

    } 
} 

공장 인터페이스 :

public interface CFactory { 
    C create(Integer number); 
} 

및 모듈 :

public class ABCModule extends AbstractModule { 

    @Override 
    protected void configure() { 
     bind(A.class).to(AImpl.class); 
     bind(B.class).to(BImpl.class); 

     install(new FactoryModuleBuilder().implement(C.class, CImpl.class).build(CFactory.class)); 
    } 

    public static void main(String[] args) { 
     Guice.createInjector(new ABCModule()).getInstance(CFactory.class).create(123); 
    } 

} 

위는 다음과 같은 스택 트레이스와 함께 실패

스레드 "main" com.google.inject.CreationException : Guice 만들기 오류 :

1) stack.AImpl에서 적절한 생성자를 찾을 수 없습니다. 클래스는에 @Inject 또는비공개가 아닌 인수가없는 생성자로 주석 된 생성자가 하나 이상 있어야합니다. stack.ABCModule.configure (ABCModule.java:14)에서 stack.AImpl.class (AImpl.java:12)에서

2) stack.CImpl는 @AssistedInject 생성자를 가지고 있지만 그들 중 누구도 매개 변수와 일치하지 메서드 stack.CFactory.create(). AssistedInject 팩토리를 만들 수 없습니다. (CFactory.java:1) stack.CFactory.create stack.C에서의 위치 동안 stack.CImpl을 찾는 동안 com.google.inject.internal.Errors.throwCreationExceptionIfErrorsExist (Errors.java:435)에서

2 에러 com.google.inject.internal.InternalInjectorCreator.build에서 com.google.inject.internal.InternalInjectorCreator.initializeStatically (InternalInjectorCreator.java:154) (InternalInjectorCreator.java:106) com.google.inject에서 에서 . Guice.createInjector (Guice.java:95) at com.google.inject.Guice.createInjector (Guice.java:72) at com.google.inject.Guice.createInjector (Guice.java:62) stack.ABCModule.main (ABCModule.java:21는)

이것은 분명히 내가 확장에서 너무 많은 싶은 것을 의미한다 - 나는 인젝터가 @Assisted 의존성에 대한 탐색 실행 종속 트리에 깊은 검색 될 것으로 기대 . 이런 보조 주입을 할 수있는 방법이 있습니까? 아니면 직접 공장을 구현해야합니까?

답변

0

당신이 답을 찾을 수 있습니다 여기

Guice assisted injection deeper down the dependency hierarchy

비슷한 질문이 있습니다.

+0

사실은 같은 질문이지만주의하지 않았습니다. 불행히도 간단한 해결책은 없다는 것을 증명하지만, 어쨌든 여전히 대답입니다, 감사합니다. – macias

0

코드에 몇 가지 문제가 있습니다. 당신은 "C"로의 "A"를 주입해야하지만 공장은

public interface CFactory { 
    C create(Integer number); 
} 

이 또한 내가 Guice에 의해 제공되는 @AssistedInject 주석이 없다고 생각 정수를 주입하도록 설정되어 있습니다.생성자에 @Inject을 대신 사용하고 전달할 매개 변수를 표시하십시오. @Assisted

+0

문제가 없습니다 (Guice에서는 기본적으로이 작업을 수행 할 수 없습니다). A와 B는 Guice에 의해 자동으로 주입되기로되어 있는데 Integer 매개 변수 (Guice가 A 생성자에 적용)를 사용하여 전체 클래스 시스템을 매개 변수화하는 팩토리를 얻고 싶었습니다. 예, @AssistedInject 주석 [docs] (http://google.github.io/guice/api-docs/latest/javadoc/index.html?com/google/inject/assistedinject/AssistedInject.html)이 있습니다. 그렇지 않으면 stacktrace는 약간 다르게 보일 것입니다. – macias

+0

내가 알기를, 정수가 가장 가까운 의존성에 전달되기를 바랬다. 생성자는 "A"를 취하고 공장은 "Integer"를 전달하므로 실수 중 하나를 설명했다. – Joseph

관련 문제