2011-01-25 63 views
26

我需要綁定一個類作爲兩個接口的實現。它應該被綁定在一個單例範圍內。如何將一個實現綁定到Google Guice的幾個接口?

我所做的:

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

但是,很明顯,它會導致產生兩個不同的實例,因爲他們被綁定到不同的密鑰。

我的問題是我該怎麼做?

回答

50

Guice的維基有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的條款及答案來得相當自然。

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 
{ 
} 

,使DefaultSettings實施DefaultSettingsInterface

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

謝謝,鮑里斯! 我相信你的解決方案可行! 我剛剛發現了另一種方式: bind(FirstSettings.class)。 (DefaultSettings.class)。 (Singleton.class); bind(SecondSettings.class)。 (FirstSettings.class)。 (Singleton.class); 它似乎也起作用。 你覺得呢? – Pavel 2011-01-25 10:23:12

+1

我不知道FirstSettings擴展了SecondSettings。在那種情況下,它是有效的並且更短。發佈您的解決方案作爲答案,並在一段時間後推廣它作爲最好的:) – 2011-01-25 10:30:29

+0

是的,這是真的。我的錯,我沒有提到:) – Pavel 2011-01-25 10:37:15

3

的解決方案,我發現是:

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

它適用於我的情況,因爲SecondSettings擴展了FirstSettings。

相關問題