2011-09-14 4 views
1

다음과 같은 코드가 있습니다.Guice와 함께 생성자에서 검사 된 예외를 잘 처리하는 방법은 무엇입니까?

class A { 
    X x; 

    A() { 
    Class<? extends X> cls = ...; 
    Module module = ...; 
    Injector injector = Guice.createInjector(module); 
    x = injector.getInstance(cls); 
    } 
} 

콘크리트 유형 cls은 런타임에만 결정되며이 생성자가 호출되기 전에는 알 수 없습니다.

지금 내 문제는 cls의 생성자가 확인 된 예외를 던질 것으로 예상되며 가능한 경우 ProvisionException에서 래핑하지 않고 처리하려고합니다. Guice 문서에서는 throwing Provider Extension을 사용해야한다고 말합니다. 여기에는 복잡한 것 같습니다. 이보다 더 간단한 방법이 있습니까?

interface MyCheckedProvider<T> extends CheckedProvider<T> { 
    T get() throws MyCheckedException; 
} 

class XImplProvider implements MyCheckedProvider<X> { 
    @Inject dependency1; 
    @Inject dependency1; 

    X get() throws MyCheckedException { 
    return new XImpl(dependency1, dependency2); 
    } 
} 

class ProviderHolder { 
    @Inject MyCheckedProvider<X> provider; 
} 

class A { 
    X x; 

    A() { 
    Class<? extends MyCheckedProvider<X>> providerClass = ...; 
    Module module = new AbstractModule() { 
     void configure() { 
     ... 
     ThrowingProviderBinder.create(binder()) 
      .bind(MyCheckedProvider.class, X.class) 
      .to(providerClass.class); 
     } 
    }; 

    Injector injector = Guice.createInjector(module); 
    ProviderHolder holder = injector.getInstance(ProviderHolder.class); 
    try { 
     x = holder.provider.get(); 
    catch (MyCheckedException e) { 
     ... 
    } 
    } 
} 

인터페이스 MyCheckedProvider은 여러 장소에서 재사용 할 수 있기 때문에 괜찮을 것입니다.하지만 비슷한 것이 필요한 곳마다 별도의 ProviderHolder 클래스가 필요합니다. X를 구현하는 각 클래스에 대해 특정 공급자 구현이 필요합니다 (그 중 많은 수가있을 수 있음). 그래서 이것은 XFactory를 주입하고 각각의 구체적인 유형에 대해 XFactoryImpl을 작성하는 것보다 훨씬 더 효과적입니다 (피하려고했습니다).

나는

injector.getInstance(new TypeLiteral<MyCheckedProvider<X>>() {}); 

또는

injector.getCheckedProvider(cls, MyCheckedException.class); 

와 같은 것을 할 수 있기를 바랬지만 이것이 지원되지 않는 것 같습니다.

답변

1

여기 Key 클래스를 사용하고 싶지 만 TypeLiteral이 아닙니다. 그렇다면 ProviderHolder은 필요하지 않습니다.

Injector injector = Guice.createInjector(module); 
MyCheckedProvider<X> provider = injector.getInstance(new Key<MyCheckedProvider<X>>(){}); 
try {... 
+0

물론 내가 왜 그런걸 보지 못했는지 모릅니다. 감사! 이제'XImplProvider'도 제거 할 수 있다면 좋을 것입니다. –

관련 문제