Функции, подобные типу mysql_connect()
, mysql_query()
, представляют собой предыдущие функции PHP, т. е. (PHP 4) и теперь не используются.
Они заменяются на mysqli_connect()
, mysqli_query()
аналогично в последнем PHP5.
Это причина ошибки.
Способ обмана: 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
доступной для всего графика объекта развязанным способом.
Я вижу три варианта. Они зависят от того, как часто вы меняете input
для A
.
1) Привяжите input
как константу в вашем модуле. Это работает только, если вы знаете это значение, прежде чем создавать Injector
и никогда не хотите изменять значение. См. bindConstant
2) Используйте частный подмодуль, который связывает либо A
, либо значение для input
внутри этого модуля. В принципе, вы можете иметь два или три экземпляра графа с разным значением. См. newPrivateBinder .
3) Используйте Scope
ala RequestScope
, SessionScope
, ... Таким образом, вы можете часто менять вход, но вы должны ввести / оставить область в какой-то момент должна быть определена. См. Пользовательские области для примера.