Как я могу сделать инъецированную зависимость WireBox доступной для метода конструктора? - PullRequest
0 голосов
/ 08 ноября 2018

В этом примере у меня есть объект модели с именем test.cfc, который имеет зависимость testService.cfc.

test имеет вставку WireBox testService через объявление свойства. Объект выглядит так:

component {

     property name="testService" inject="testService";

     /**
     *  Constructor
     */
     function init() {

         // do something in the test service
         testService.doSomething();

         return this;

     }

 }

Для справки, testService имеет единственный метод с именем doSomething(), который выводит некоторый текст:

component
     singleton
{

     /**
     *  Constructor
     */
     function init() {

         return this;

     }


     /**
     *  Do Something
     */
     function doSomething() {

         writeDump( "something" );

     }

 }

Проблема в том, что WireBox, похоже, не вводит testService, пока не сработает метод конструктора init(). Итак, если я запускаю это в моем обработчике:

prc.test = wirebox.getInstance(
     name = "test"
);

Я получаю следующее сообщение об ошибке: Error building: test -> Variable TESTSERVICE is undefined.. DSL: , Path: models.test

Просто ради здравого смысла, если я изменю test, чтобы после создания объекта на него ссылались testService, все работает нормально. Кажется, что проблема изолирована от методов конструктора.

Как я могу убедиться, что на мои зависимости можно ссылаться в моих методах конструктора объектов? Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 08 ноября 2018

Из-за порядка построения в методе init() нельзя использовать инъекции свойства или сеттера. Вместо этого вы можете получить к ним доступ методом onDIComplete(). Я понял, что в документах на WireBox есть только временная ссылка, поэтому я добавил этот отрывок:

https://wirebox.ortusbooks.com/usage/injection-dsl/id-model-empty-namespace#cfc-instantiation-order

Построение ХФУ происходит в этом порядке.

  1. Компонент создается с createObject()
  2. CF автоматически запускает псевдо-конструктор (любой код вне объявления метода)
  3. Вызывается метод init() (если он существует), передающий любые аргументы конструктора
  4. Свойство (mixin) и настройка впрыска происходят
  5. Вызывается метод onDIComplete() (если он существует)

Таким образом, правильная версия вашего CFC будет выглядеть следующим образом:

component {

     property name="testService" inject="testService";

     /**
     *  Constructor
     */
     function init() {
         return this;
     }

     /**
     *  Called after property and setter injections are processed
     */
     function onDIComplete() {
         // do something in the test service
         testService.doSomething();
     }

 }

Обратите внимание, что было бы также приемлемо переключиться на инжекцию конструктора, но мое личное предпочтение - это инъекция свойства из-за уменьшенного количества необходимости получать аргумент и сохранять его локально.

https://wirebox.ortusbooks.com/usage/wirebox-injector/injection-idioms

...