Coldfusion 在另一个cfc中访问应用范围的cfc

Coldfusion 在另一个cfc中访问应用范围的cfc,coldfusion,application.cfc,Coldfusion,Application.cfc,我已在applicationstart()的应用范围中放置了cfc。有没有一种方法可以让我在另一个cfc中访问它 <cffunction name="method2" access="remote" returnType="Array" output="false"> <cfinvoke component="application.cfc1" method="method1" returnVariable="result" /> <cfreturn re

我已在applicationstart()的应用范围中放置了cfc。有没有一种方法可以让我在另一个cfc中访问它

 <cffunction name="method2" access="remote" returnType="Array" output="false">
    <cfinvoke component="application.cfc1" method="method1" returnVariable="result" />
<cfreturn result>
 </cffunction>


谢谢。

有几种不同的方法可以做到这一点。亨利的建议奏效了。如果您想使用
cfinvoke
,您也可以这样做,但您需要了解标记是如何工作的

<cfinvoke component="application.cfc1" ... /> 

这里使用的语法是将字符串传递给组件属性,它将查找文件“/application/cfc1.cfc”,并尝试调用该组件上的方法。这大致相当于从Java类调用静态方法。它失败是因为您在该位置没有CFC文件

如果已经实例化了一个组件,那么需要将变量传递给cfinvoke标记,而不是字符串文本。简单的修改就是在变量名周围添加散列

<cfinvoke component="#application.cfc1#" ... />

通常,所有ColdFusion标记都是这样工作的。如果在没有散列的属性中放入值,则为ColdFusion提供的是字符串文字值,而不是变量。要向标记提供变量,请将变量名括在哈希中

这有时是惊人的强大,如果以一种不寻常的方式使用,也会引起混乱。例如,我很确定这段代码可以工作,但应该避免:

<cfset myvarname = "result" />
<cfinvoke returnVariable="#myvarname#" ... />

然后,来自cfinvoke标记的方法调用的结果将被放置在名为
result
的局部变量中,因为这是提供给returnVariable属性的myvarname变量的值

编辑:我想从下面的评论中添加澄清。当使用组件属性的字符串文本值调用
cfinvoke
时(上面的第一个示例),Dan是正确的,将创建组件实例以调用该方法(ColdFusion中没有真正的静态方法)。如果在循环中调用该方法或频繁调用该方法,这可能(通常)是不可取的,因为您将创建大量整个对象,然后ColdFusion服务器将不得不将这些对象存储在内存中并很快进行垃圾收集。然而,Henry也是正确的,如果您使用散列传递对象引用(上面的第二个示例),那么将使用现有对象,而不是为每个调用创建新实例,这样您就不会有性能问题


话虽如此,我个人很少使用cfinvoke的主要原因是,与Henry推荐的方法调用相同的方法相比,大多数时候使用cfinvoke需要更多的按键。此外,我也不确定自己是否找到过不使用实例化对象的真正令人信服的理由,即使它只是我加载到依赖项注入框架(ColdSpring、LightWire等)中的一个实用程序类,以便我的其他对象可以访问它。不过,在一些边缘情况下,我发现使用
cfinvokeargument
很有用

是的,应该可以,但我想你会更喜欢这样写:
如果它不适合你,请发布错误/异常。谢谢亨利的帮助!!噢,@samueldaley是对的,你需要
##
来引用你的
应用程序。cfc1
我建议根本不要使用cfinvoke。我的理解是,cfinvoke从cfc创建一个对象,然后运行该方法。在这种情况下,对象已经存在,这使得cfinvoke的效率低于根据@Henry对问题的评论简单调用方法的效率。@DanBracuk不,如果对象的引用通过
#
@DanBracuk传递给
组件
,cfinvoke将不会实例化新对象,这是一个很好的观点,尽管有点困惑。我编辑了我的答案,添加了一些澄清。