Как связать класс с конструктором в Guice - PullRequest
0 голосов
/ 29 октября 2018

Я хочу привязать MyImpl к Multibinding. Но конструктор MyImpl принимает параметр.

final Multibinder<MyInterface> binder = Multibinder.newSetBinder(binder(), MyInterface.class)
binder.addBinding().to(MyImpl.class);

public MyImpl(Boolean myParam) ...

Я не хочу @ Inject это, потому что это говорит логическое, которое может иногда вводиться где-то еще. Так. Я могу ввести немного Enum и ввести его вместо этого, как тогда это сделать? Или мне лучше просто написать как-нибудь

binder.addBinding().to(MyImpl.class, true);
binder.addBinding().to(MyImpl2.class, false);

или около того?

1 Ответ

0 голосов
/ 30 октября 2018

Я не хочу @ Inject это, потому что это говорит логическое, которое может иногда вводиться где-то еще. Чтобы избежать этого, используйте именованные аннотации.

Решение первое:

@Inject
public TextEditor(@Named("OpenOffice") SpellChecker spellChecker) { ...}

Вот код привязки:

bind(SpellChecker.class).annotatedWith(Names.named("OpenOffice")).to(OpenOfficeWordSpellCheckerImpl.class);

Решение второе:

Загрузите java-свойства в модуль и используйте java-prop-names:

private static Properties loadProperties(String name){
    Properties properties = new Properties();
    ClassLoader loader = Thread.currentThread().getContextClassLoader();
    InputStream is = loader.getResourceAsStream(name);
    try {
        properties.load(is);
    } catch (IOException e) {
        throw new RuntimeException(e);
    }finally {
        if(is != null){
            try {
                is.close();
            } catch (IOException dontCare) { }
        }
    }
    return properties;
}

protected void configure() {
    try{
        Properties gameProperties = loadProperties("game.properties");
        Names.bindProperties(binder(),gameProperties);
    }catch (RuntimeException ex){
        addError("Could not configure Game Properties");
    };

}
...