2011-11-08 7 views
3

以下に示すような、1つのインターフェースが複数の親インターフェースを拡張し、そのインターフェースを1つ実装したデザインがあります。私のクライアントクラスで複数のインターフェースをGuiceの1つの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

前にシルクのことを聞いたことがありません。それは私の次のプロジェクトのために試してみましょう。ありがとう! –

関連する問題