2013-10-24 4 views
0

그래서 나는 거의 내가 여기에있는 좋은 기사 다음 내 자신에 대한 몇 가지 주석과 guice을 확장하는 것을 시도하고있는 guicy 방법 : http://developer.vz.net/2012/02/08/extending-guice-2/이는 것을 제외하고는 나를 위해 꽤 OK 작동확장 guice -

:

여기

final SchedulerService schedulerService = new SchedulerService(); 

그리고 숨겨진 악 :

지금 내 모듈에서 나는 이러한 서비스 중 하나의 인스턴스. 이 사람은 운이 좋았지 만 의존성이없는 단순한 객체 만 필요했습니다. 하지만 내 경우에 내 Service 두 개의 하위 서비스에 대한 참조가 필요합니다. 그리고 그는 new을 사용하여 Service을 만들었으므로 두 서브 서비스 모두에 new을 사용해야합니다. 그래서 만들 수 있습니다. 따라서 이러한 하위 서비스에 일부 속성을 주입 할 수 없습니다. 효과적으로 나는 구술되지 않은 전체 object-subtree를 만들고 있습니다.

주위에 경로가 있습니까? Guice가 나를 위해 Service을 인스턴스화 한 다음 TypeListener에 등록하도록 할 수 있습니까?

답변

2

당신은 실제로 당신이 인젝터가 존재 때까지 get를 호출하지 않겠다고 약속으로, (BinderAbstractModule에) getProvider를 사용하여 모듈 내에서 주입 항목의 공급자에 대한 액세스를 얻을 수 있습니다. (당신은 당신이 할 get an IllegalStateException 있을지.) 그 시점에서

은 당신의 코드는 다음과 같은 :

Provider<YourService> yourServiceProvider = getProvider(YourService.class); 
final InjectionListener injectionListener = new InjectionListener() { 
    public void afterInjection(Object injectee) { 
    yourServiceProvider().get().accept(injectee); 
    } 
} 

여기에 유일한 문제 서비스 및 종속성을 주입하는 것은 아마도 트리거하려고하는 것입니다 귀하의 InjectionListener - 무한 루프가 발생할 가능성이 있습니다. null 가드를 추가하고 서비스가 null 인 동안 모든 주입을 무시함으로써이를 해결할 수 있습니다.

Injector injectorWithoutListener = Guice.createInjector(new YourServiceModule()); 
YourService yourService = injectorWithoutListener.getInstance(YourService.class); 
Injector finalInjector = injectorWithoutListener.createChildInjector(
    new YourInjectionListenerModule(yourService), new EverythingElseModule()); 

참고 여전히 생성됩니다 부모 인젝터로 구성 싱글 행동을 객체 : 귀하의 더 좋은 방법은, 그러나, YourService을 부트 스트랩 리스너없이 인젝터를 만들고, 자식 인젝터에 리스너를 추가 할 수 있습니다 거기서 finalInjector에서 생성 된 인스턴스는 injectorWithoutListener의 인스턴스와 싱글 톤 동작을 공유합니다. createChildInjectorbinding resolution order에 대한 자세한 내용을 볼 수도 있습니다.

+0

많은 노력에 감사드립니다. Actaully 나는 어제 그 문제를 생각할 때 같은 생각을했습니다. 그것은 최고의 별도의 인젝터와 새로운 모듈 것입니다. 나는 그것이 분명하고 & 깨끗하게 만드는'childInjector'에 대해서 알지 못했다. 곧 시도하고 받아 들일 것입니다! –