我正在寻找从cfscript中的不同组件动态调用方法的最佳方法。请注意,它涉及不同组件中的方法。到目前为止,我已经尝试了3种不同的方法,但它们似乎都不是我正在寻找的方法:
所有案例都是在组件方法中的cfscript中编写的。假设我正在尝试动态调用 MyComponent 组件中的setName(required string name)
方法。所有案例都定义了以下变量:
var myComp = new MyComponent();
var myMethod = "setName";
var args = {"name"="foo"};
使用evaluate()
作业
evaluate("myComp.#myMethod#(argumentCollection=args)");
专业人员:用很少的代码完成 缺点:代码不是很“干净”,使用evaluate()似乎在在线社区中具有“邪恶”的声誉。我不希望我的代码变得邪恶。
为<cfinvoke>
invoke("MyComponent", myMethod, args);
专业人士:我可以使用cfinvoke
的所有功能
缺点:每次调用都会创建MyComponent
的新实例。
在MyComponent
中创建dynamicMethod
方法
myComp.dynamicMethod(myMethod, args);
MyComponent的dynamicMethod:
public any function dynamicMethod(required string methodName, required struct argumentColl){
var cfcMethod = variables[arguments.methodName];
return cfcMethod(argumentCollection=arguments.argumentColl);
}
专业人员:我终于可以直接调用myComp了。迄今为止最舒适的解决方案 缺点:我现在可以通过dynamicMethod调用MyComponent的私有方法 (我还尝试了MyComponent之外的'function as variable'解决方案,但是函数失去了它的工作上下文。例如,如果MyComponent扩展了一个组件,'super'范围将不再引用扩展组件。) / p>
这些解决方案似乎都不是完美的,所以没有其他方法可以从不同的控制器调用动态函数吗? 如果没有,哪一个是最佳解决方案?
欢迎任何建议,谢谢。
答案 0 :(得分:7)
很好的分析。
你可以做的一件事就是用你的包装函数更接近地模仿<cfinvoke>
。 <cfinvoke>
将在COMPONENT
属性中采用组件路径或组件实例(即:对象)。所以你的'con''它会在每次调用时创建一个MyComponent的新实例。是不是真的有效。
ColdFusion 10,顺便说一下,添加了invoke()
函数来实现这一点。我注意到你在使用CF9,所以这对你没有帮助。但这可能与其他可能会提出这个问题的人有关。