2011-01-25 7 views
26

2つのインターフェイスの実装として1つのクラスをバインドする必要があります。また、シングルトンスコープでバインドする必要があります。Google Guiceを使用して1つの実装をいくつかのインターフェースにバインドする方法は?

bind(FirstSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 
bind(SecondSettings.class). 
    to(DefaultSettings.class). 
    in(Singleton.class); 

をしかし、彼らは別のキーにバインドされているので、明らかに、それは、2つの異なるインスタンスの作成につながる:私は何をやったか

どうすればいいですか?だから、

答えて

50

Guiceのwikiはa documentation about this use caseです。

基本的に、これはあなたが何をすべきかです:

// Declare that the provider of DefaultSettings is a singleton 
bind(DefaultSettings.class).in(Singleton.class); 

// Bind the providers of the interfaces FirstSettings and SecondSettings 
// to the provider of DefaultSettings (which is a singleton as defined above) 
bind(FirstSettings.class).to(DefaultSettings.class); 
bind(SecondSettings.class).to(DefaultSettings.class); 

任意の追加クラスを指定する必要はありません。ただProvider秒の観点から考えると、答えは、むしろ自然に来るが。

+1

最も洗練されたソリューション! –

2

DefaultSettingsはすなわち、FirstSettingsSecondSettings両方の実装です:

public class DefaultSettings implements FirstSettings, SecondSettings 
{ 
} 

のは、あなたがクラスEngineAEngineB

public class EngineA 
{ 
    @Inject 
    private FirstSettings settings; 
} 

public class EngineB 
{ 
    @Inject 
    private SecondSettings settings; 
} 

を持っていて、同じを注入したいとしましょう実装。

あなたはインターフェイスDefaultSettingsInterface

public interface DefaultSettingsInterface extends FirstSettings, SecondSettings 
{ 
} 

を宣言し、次に設定がかもしれDefaultSettingsDefaultSettingsInterface

public class DefaultSettings implements DefaultSettingsInterface 
{ 
} 

を実装することができます:

bind(FirstSettings.class).to(DefaultSettingsInterface.class); 
bind(SecondSettings.class).to(DefaultSettingInterface.class); 
bind(DefaultSettingsInterface.class).to(DefaultSettings.class).in(Singleton.class); 
+1

ありがとう、Boris! 私はあなたのソリューションが動作すると信じています! 自分で別の方法を見つけました: bind(FirstSettings.class)。 to(DefaultSettings.class)。 (Singleton.class); ; bind(SecondSettings.class)。 〜(FirstSettings.class)。 (Singleton.class); ; それはうまくいくようです。 あなたはどう思いますか? – Pavel

+1

FirstSettingsがSecondSettingsを拡張していることがわかりませんでした。その場合、有効で、はるかに短くなります。あなたの解決策を回答として投稿し、しばらくしてからそれを最善のものとして宣伝してください:) –

+0

はい、それは本当です。私のせいで、私はそれについて言及していません:) – Pavel

3

ソリューション、私が見つけましたは:

SecondSettingsがFirstSettingsを拡張するので、私のケースでは機能します。

+1

SecondSettingsがFirstSettingsのサブクラス、サブインターフェイスの場合にのみ機能します。 FirstSettingsとSecondSettingsの間にリンクが存在しないこのケースやその他のソリューションがあります。 –

関連する問題