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

时间:2014-04-03 17:01:01

标签: coldfusion application.cfc

我已在applicationstart()中将cfc放在应用程序范围内。有没有办法可以在另一个cfc中访问它。

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

谢谢..

1 个答案:

答案 0 :(得分:1)

有几种不同的方法可以做到这一点。亨利的推荐有效。如果您想使用cfinvoke,您也可以这样做,但您需要了解标签的工作原理。

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

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

如果您已经实例化了一个组件,那么您需要将变量传递给cfinvoke标记而不是字符串文字。实现这一目标的简单更改是在变量名称周围添加哈希

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

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

这有时令人惊讶地强大,如果以不寻常的方式使用它也会引起混淆。例如,我非常确定这段代码是可行的,但应该避免:

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

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

编辑:我想在下面的评论中添加说明。当使用组件属性的字符串 - 文字值调用cfinvoke时(上面的第一个示例),Dan是正确的,创建组件的实例以调用该方法(没有真正的静态方法) ColdFusion的)。如果您在循环中调用该方法或以其他方式频繁调用该方法,这可能是不合需要的(通常),因为您要创建许多ColdFusion服务器必须存储在内存中的整个对象。很快垃圾收集。但是亨利也是正确的,如果你传递带有哈希的对象引用(上面的第二个例子),则使用现有对象而不是为每个调用创建一个新实例,因此你不会遇到性能问题。

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