2011-01-25 62 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。

相关问题