Как привязать одну реализацию к нескольким интерфейсам с Google Guice? - PullRequest
30 голосов
/ 25 января 2011

Мне нужно связать один класс как реализацию двух интерфейсов.И это должно быть связано в одной области видимости.

Что я сделал:

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

Но, очевидно, это приводит к созданию двух разных экземпляров, потому что они связаны сразные ключи.

Мой вопрос: как мне это сделать?

Ответы [ 3 ]

55 голосов
/ 25 января 2011

В вики Guice есть документация по этому варианту использования .

По сути, это то, что вы должны сделать:

// 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 s, и ответ приходит довольно естественно.

4 голосов
/ 25 января 2011

Я нашел следующее решение:

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

В моем случае это работает, поскольку SecondSettings расширяет FirstSettings.

2 голосов
/ 25 января 2011

Итак, DefaultSettings является реализацией FirstSettings и SecondSettings, то есть:

public class DefaultSettings implements FirstSettings, SecondSettings
{
}

Допустим, у вас есть класс EngineA и EngineB

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