开发者

How to bind one implementation to a few interfaces with Google Guice?

I need to bind one class as implementation of two interfaces. And it should be binded in a singleton scope.

What I've done:

bind(FirstSettings.class).
    to(De开发者_如何学PythonfaultSettings.class).
    in(Singleton.class);
bind(SecondSettings.class).
    to(DefaultSettings.class).
    in(Singleton.class);

But, obviously, it leads to creation of two different instances, because they are binded to the different keys.

My question is how can I do that?


Guice's wiki has a documentation about this use case.

Basically, this is what you should do:

// 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);

There is no need to specify any additional classes: just think in terms of Providers and the answer comes rather naturally.


The solution, I've found is:

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

It works in my case, because SecondSettings extends FirstSettings.


So, DefaultSettings is an implementation of both the FirstSettings and SecondSettings, ie:

public class DefaultSettings implements FirstSettings, SecondSettings
{
}

Let's say you have a class EngineA and EngineB

public class EngineA
{
    @Inject
    private FirstSettings settings;
}

public class EngineB
{
    @Inject
    private SecondSettings settings;
}

and you would like to inject the same implementation.

You can declare an interface DefaultSettingsInterface

public interface DefaultSettingsInterface extends FirstSettings, SecondSettings
{
}

and make the DefaultSettings implement DefaultSettingsInterface

public class DefaultSettings implements DefaultSettingsInterface
{
}

Then the configuration may be:

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜