Как связать одну реализацию с несколькими интерфейсами с Google Guice?
Мне нужно связать один класс как реализацию двух интерфейсов. И он должен быть привязан в одноэлементной области.
Что я сделал:
bind(FirstSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
bind(SecondSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
Но, очевидно, это приводит к созданию двух разных экземпляров, поскольку они привязаны к различным ключам.
Мой вопрос: как я могу это сделать?
Ответы
Ответ 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);