Google Guice - пользовательский объем и вспомогательная инъекция [дубликат]

Функции, подобные типу mysql_connect(), mysql_query(), представляют собой предыдущие функции PHP, т. е. (PHP 4) и теперь не используются.

Они заменяются на mysqli_connect() , mysqli_query() аналогично в последнем PHP5.

Это причина ошибки.

13
задан orsg 1 May 2013 в 11:47
поделиться

2 ответа

Способ обмана: Stick input в статической переменной или singleton ThreadLocal. Установите его перед запуском вашего конвейера и очистите его после его завершения.

Необычный способ: в A обратитесь к @PipelineInput String inputString, но не привязывайте его к основному инжектору. В противном случае свяжите зависимости, как обычно, в том числе со ссылкой на @PipelineInput в других классах, связанных с конвейером. Когда вам понадобится D, получите его из вашей реализации DFactory, которую я вызываю PipelineRunner.

public class PipelineRunner {
  @Inject Injector injector; // rarely a good idea, but necessary here

  public D createD(final String inputForA) {
    Module module = new AbstractModule() {
      @Override public void configure() {
        bindConstant(inputForA).annotatedWith(PipelineInput.class);
      }
    };
    return injector.createChildInjector(new PipelineModule(), module)
        .getInstance(D.class);
  }
}

Естественно, попытки привязки для A, B, C и D выходят за пределы PipelineRunner из-за отсутствия @PipelineInput String - вы получите CreationException, когда вы создадите инжектор с этими неудовлетворенными зависимостями, как вы обнаружили - но эти зависимости на основе трубопроводов должны быть легко разделены на модуль, который вы устанавливаете в дочерний инжектор.

Если это слишком хаки, помните, что PrivateModules также « реализованы с использованием родительских инжекторов ] ", и что вся цель инъекции зависимостей заключается в том, чтобы сделать зависимость, подобную inputForA доступной для всего графика объекта развязанным способом.

7
ответ дан Jeff Bowman 28 August 2018 в 20:39
поделиться

Я вижу три варианта. Они зависят от того, как часто вы меняете input для A.

1) Привяжите input как константу в вашем модуле. Это работает только, если вы знаете это значение, прежде чем создавать Injector и никогда не хотите изменять значение. См. bindConstant

2) Используйте частный подмодуль, который связывает либо A, либо значение для input внутри этого модуля. В принципе, вы можете иметь два или три экземпляра графа с разным значением. См. newPrivateBinder .

3) Используйте Scope ala RequestScope, SessionScope, ... Таким образом, вы можете часто менять вход, но вы должны ввести / оставить область в какой-то момент должна быть определена. См. Пользовательские области для примера.

1
ответ дан A.H. 28 August 2018 в 20:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: