provides - java guice bind
¿Cómo enlazar una implementación a unas pocas interfaces con Google Guice? (3)
Necesito unir una clase como implementación de dos interfaces. Y debe estar enlazado en un alcance de singleton.
Qué he hecho:
bind(FirstSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
bind(SecondSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
Pero, obviamente, conduce a la creación de dos instancias diferentes, porque están vinculadas a las diferentes claves.
Mi pregunta es ¿cómo puedo hacer eso?
La solución que he encontrado es:
bind(FirstSettings.class).
to(DefaultSettings.class).
in(Singleton.class);
bind(SecondSettings.class).
to(FirstSettings.class).
in(Singleton.class);
Funciona en mi caso, porque SecondSettings extiende FirstSettings.
La wiki de Guice tiene una documentación sobre este caso de uso .
Básicamente, esto es lo que debes hacer:
// 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);
No es necesario especificar ninguna clase adicional: solo piense en términos de Provider
y la respuesta es bastante natural.
Por lo tanto, DefaultSettings
es una implementación de FirstSettings
y SecondSettings
, es decir:
public class DefaultSettings implements FirstSettings, SecondSettings
{
}
Digamos que tienes una clase EngineA
y EngineB
public class EngineA
{
@Inject
private FirstSettings settings;
}
public class EngineB
{
@Inject
private SecondSettings settings;
}
y le gustaría inyectar la misma implementación.
Puede declarar una interfaz DefaultSettingsInterface
public interface DefaultSettingsInterface extends FirstSettings, SecondSettings
{
}
y hacer que DefaultSettings
implemente DefaultSettingsInterface
public class DefaultSettings implements DefaultSettingsInterface
{
}
Entonces la configuración puede ser:
bind(FirstSettings.class).to(DefaultSettingsInterface.class);
bind(SecondSettings.class).to(DefaultSettingInterface.class);
bind(DefaultSettingsInterface.class).to(DefaultSettings.class).in(Singleton.class);