2011-11-08 2 views
3

하나의 인터페이스가 여러 개의 상위 인터페이스를 확장하고 그 인터페이스의 구현이 하나 인 다음과 같은 디자인이 있습니다. 내 클라이언트 클래스에서여러 인터페이스를 Guice의 하나의 impl에 자동으로 바인딩

Class diagram

는 차라리 ZooKeeperClient보다, 단지 부모 인터페이스 중 하나 이상에 의존합니다. 클라이언트 클래스의 종속성을 줄여주는 디자인이 더 좋으며 테스트에서 모의 ​​작업을 더 쉽게 수행 할 수 있다고 생각합니다.

@Inject 
public Foo(ServiceUpdater su) { 
    // ... 
} 

그러나, 나는 수동으로 구현 클래스에 각 인터페이스에서 바인딩을 추가해야이 달성하기 위해 :

bind(ServiceCreator.class).to(ZooKeeperClientImpl.class) 
bind(ServiceDeleter.class).to(ZooKeeperClientImpl.class) 
bind(ServiceUpdater.class).to(ZooKeeperClientImpl.class) 
// ... 
bind(ZooKeeperClient.class).to(ZooKeeperClientImpl.class) 

을 나는이 반복을 피하고 바인딩 Guice을 알 수있는 방법이 있습니까 한 번에 전체 계층 구조? 뭔가가 ...

bind(ZooKeeperClient.class/* and its parents*/).to(ZooKeeperClient.class) 

그렇지 않은 경우 여기에 내 디자인에 문제가 있습니까? 내가 기분이 좋지 않은 일을하고 있니?

답변

2

Guice에는 그런 방법이 없습니다. ClassUtils.getAllInterfaces() 같은 유틸리티를 사용하여 모든 인터페이스를 반복하고 바인딩 할 수 있습니다.

+0

확인 및 링크를 제공해 주셔서 감사합니다. –

1

Silk에서 구현 유형에 autobind을 사용할 수 있습니다.

autobind(ZooKeeperClientImpl.class).toConstructor(); 

이 (Object 제외) 모든 인터페이스와 슈퍼 클래스에 클래스를 바인딩합니다. 이 바인딩은보다 명시 적 바인딩 약한 있습니다 - 그래서 뭔가 다른 ZooKeeperClientImpl 슈퍼 유형 중 하나를 결합

bind(ServiceUpdater.class).to(AnotherImplementation.class); 

지배 당신이 때문에 모호한 의 충돌을하지 않도록 자동 바인드 완료 바인딩.

실크는 Guice와 매우 흡사합니다. Guice 코드가 많지 않으면 변경하기가 쉽고 빠릅니다.

+0

이전에는 실크에 대해 들어 본 적이 없습니다. 내 다음 프로젝트를 시도해 볼 것입니다. 감사! –

관련 문제