在此示例中,我有一个名为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
,一切都会正常进行。这个问题似乎只限于构造方法。
如何确保我的依赖项可以在我的对象构造函数方法中引用?感谢您的协助!
答案 0 :(得分:7)
由于构造的顺序,您不能在init()
方法中使用属性或设置器注入。相反,您可以使用onDIComplete()
方法访问它们。我意识到WireBox文档仅对此具有传递性的引用,因此我添加了以下摘录:
https://wirebox.ortusbooks.com/usage/injection-dsl/id-model-empty-namespace#cfc-instantiation-order
CFC的创建按此顺序进行。
createObject()
实例化组件init()
方法(如果存在),并传递任何构造函数args 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