Ввод нескольких параметров Один и тот же интерфейс в Java - PullRequest
0 голосов
/ 07 февраля 2020

Я должен обработать несколько парсеров (не имеет значения). Как правильно ввести, чтобы StepProcessor мог получать все классы? Мой класс:

@Inject
public StepProcessor(IParser... parsers) {
    if (parsers == null) {
        throw new IllegalArgumentException("Parsers cannot be null");
    }
    this.parsers = parsers;
}

@Override
public void process( String name ) {
    for (IParser parser : parsers) {
        System.out.println(parser.getName());
    }
}

Как я делаю инъекцию?:

public class BasicModule extends AbstractModule {
@Override
protected void configure() {
    bind(IParser.class).to(XmlParser.class);
    bind(IParser.class).to(JsonParser.class);
    bind(IParser.class).to(TextParser.class);
    bind(IStepProcessor.class).to(StepProcessor.class);


}

}

Я получил: com.google.inject.CreationException: Невозможно создать инжектор см. следующие ошибки:

1) Привязка к IParser уже настроена в BasicModule.configure (BasicModule. java: 7). в BasicModule.configure (BasicModule. java: 8)

МОЕ использование:

Injector injector = Guice.createInjector(new BasicModule());
IStepProcessor comms = injector.getInstance(IStepProcessor.class);
comms.process("name");

1 Ответ

1 голос
/ 12 февраля 2020

Вы можете использовать то, что называется MultiBinding от Guice, чтобы достичь этого.

@Inject
public StepProcessor(Set<IParser> parsers) { //Inject a set of IParser
    if (parsers == null) {
        throw new IllegalArgumentException("Parsers cannot be null");
    }
    this.parsers = parsers;
}

@Override
public void process( String name ) {
    for (IParser parser : parsers) {
        System.out.println(parser.getName());
    }
}

Теперь измените ваш модуль на это.

public class BasicModule extends AbstractModule {

    @Override
    protected void configure() {
        MultiBinder<IParser> iParserBinder = MultiBinder.newSetBinder(binder(), IParser.class);
        iParserBinder.addBinding().to(XmlParser.class);
        iParserBinder.addBinding().to(JsonParser.class);
        iParserBinder.addBinding().to(TextParser.class);
        iParserBinder.addBinding().to(StepProcessor.class);
}

Не забудьте соответствующий импорт. Прочтите документацию, прежде чем использовать ее, чтобы понять, как именно она работает. Надеюсь, это поможет:)

...