Подтвердить что ты не робот

Как связать одну реализацию с несколькими интерфейсами с Google Guice?

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

Что я сделал:

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

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

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

4b9b3361

Ответ 1

Guice wiki имеет документацию об этом случае использования.

В основном, это то, что вы должны сделать:

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

Решение, которое я нашел, это:

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

Это работает в моем случае, потому что SecondSettings расширяет FirstSettings.

Ответ 3

Итак, 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);