如何使用cfscript从不同的组件动态调用方法?

时间:2012-10-24 09:36:46

标签: coldfusion coldfusion-9

我正在寻找从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>

    使用cfml包装器
    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>

这些解决方案似乎都不是完美的,所以没有其他方法可以从不同的控制器调用动态函数吗? 如果没有,哪一个是最佳解决方案?

欢迎任何建议,谢谢。

1 个答案:

答案 0 :(得分:7)

很好的分析。

你可以做的一件事就是用你的包装函数更接近地模仿<cfinvoke><cfinvoke>将在COMPONENT属性中采用组件路径组件实例(即:对象)。所以你的'con''它会在每次调用时创建一个MyComponent的新实例。是不是真的有效。

ColdFusion 10,顺便说一下,添加了invoke()函数来实现这一点。我注意到你在使用CF9,所以这对你没有帮助。但这可能与其他可能会提出这个问题的人有关。