5

在这个例子中,我有一个名为的模型对象test.cfc,它有一个依赖项testService.cfc

testtestService通过属性声明注入 WireBox 。该对象如下所示:

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" );

     }

 }

testService问题是,直到构造init()方法触发之后,WireBox 似乎才注入。所以,如果我在我的处理程序中运行它:

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

我收到以下错误消息:Error building: test -> Variable TESTSERVICE is undefined.. DSL: , Path: models.test

只是为了理智,如果我修改test以便testService在构造对象后被引用,一切正常。该问题似乎与构造函数方法无关。

如何确保我的依赖项可以在我的对象构造函数方法中被引用?感谢你的协助!

4

1 回答 1

8

由于构造顺序,您不能在init()方法中使用属性或设置器注入。相反,您可以在onDIComplete()方法中访问它们。我意识到 WireBox 文档只有一个对此的传递引用,所以我添加了以下摘录:

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

CFC 建设按此顺序进行。

  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

于 2018-11-08T19:39:16.513 回答