如何使 WireBox 注入的依赖项可用于构造函数方法?
How can I make a WireBox injected dependency available to a constructor method?
在这个例子中,我有一个名为 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 似乎在构造函数 init()
方法触发后才注入 testService
。所以,如果我 运行 在我的处理程序中这样做:
prc.test = wirebox.getInstance(
name = "test"
);
我收到以下错误消息:Error building: test -> Variable TESTSERVICE is undefined.. DSL: , Path: models.test
为了理智起见,如果我修改 test
以便在构造对象后引用 testService
,一切正常。问题似乎与构造方法有关。
如何确保可以在我的对象构造函数方法中引用我的依赖项?感谢您的帮助!
由于构建顺序,不能在init()
方法中使用属性或setter注入。相反,您可以在 onDIComplete()
方法中访问它们。我意识到 WireBox 文档对此只有一个传递引用,所以我添加了以下摘录:
https://wirebox.ortusbooks.com/usage/injection-dsl/id-model-empty-namespace#cfc-instantiation-order
CFC 大楼按此顺序发生。
- 组件实例化为
createObject()
- CF 自动运行伪构造函数(方法声明之外的任何代码)
- 调用
init()
方法(如果存在),传递任何构造函数参数
- 属性 (mixin) 并且设置注入发生
- 调用
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
在这个例子中,我有一个名为 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 似乎在构造函数 init()
方法触发后才注入 testService
。所以,如果我 运行 在我的处理程序中这样做:
prc.test = wirebox.getInstance(
name = "test"
);
我收到以下错误消息:Error building: test -> Variable TESTSERVICE is undefined.. DSL: , Path: models.test
为了理智起见,如果我修改 test
以便在构造对象后引用 testService
,一切正常。问题似乎与构造方法有关。
如何确保可以在我的对象构造函数方法中引用我的依赖项?感谢您的帮助!
由于构建顺序,不能在init()
方法中使用属性或setter注入。相反,您可以在 onDIComplete()
方法中访问它们。我意识到 WireBox 文档对此只有一个传递引用,所以我添加了以下摘录:
https://wirebox.ortusbooks.com/usage/injection-dsl/id-model-empty-namespace#cfc-instantiation-order
CFC 大楼按此顺序发生。
- 组件实例化为
createObject()
- CF 自动运行伪构造函数(方法声明之外的任何代码)
- 调用
init()
方法(如果存在),传递任何构造函数参数 - 属性 (mixin) 并且设置注入发生
- 调用
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