최근 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 의존성에 대한 탐색 실행 종속 트리에 깊은 검색 될 것으로 기대 . 이런 보조 주입을 할 수있는 방법이 있습니까? 아니면 직접 공장을 구현해야합니까?
사실은 같은 질문이지만주의하지 않았습니다. 불행히도 간단한 해결책은 없다는 것을 증명하지만, 어쨌든 여전히 대답입니다, 감사합니다. – macias