如何使WireBox注入的依赖项可用于构造函数方法?

时间:2018-11-08 18:56:04

标签: dependency-injection coldfusion cfml coldbox wirebox

在此示例中,我有一个名为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" );

     }

 }

问题是,在构造函数testService方法激发之后,WireBox似乎不会注入init()。因此,如果我在处理程序中运行它:

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

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

出于理智的考虑,如果我修改test以便在构造对象之后引用testService,一切都会正常进行。这个问题似乎只限于构造方法。

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

1 个答案:

答案 0 :(得分:7)

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

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

CFC的创建按此顺序进行。

  1. 使用createObject()实例化组件
  2. CF自动运行伪构造函数(方法声明之外的任何代码)
  3. 调用init()方法(如果存在),并传递任何构造函数args
  4. 属性(混合)和注入设置发生
  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