我在冷融合组件中使用代理/委托模式,并且得到了意想不到的结果(从我的角度来看)。下面是我的代理组件——它非常简单,我只是用我想要委托给的实际组件来初始化 CFC,然后将命名函数从该 CFC 映射到代理函数(下面为本示例进行了简化)
我创建了一个代理组件,如下所示:
component output="false"{
/** Constructor for proxy - requires an instance of myFusebox **/
public MyFuseboxProxy function init( Required any myFb ){
variables.myFusebox = arguments.myFb;
return this;
}
this.do = variables.proxy;
this.getApplication = variables.proxy;
this.getApplicationData = variables.proxy;
private any function proxy(){
var local.functionName = getFunctionCalledName();
var local.function = variables.myFusebox[local.functionName];
var local.returnVal = local.function( argumentCollection=arguments );
return local.returnVal;
}
}
从我的应用程序中,我调用以下代码:
variables.myFusebox = new ab.MyFuseboxProxy( variables.myFusebox );
variables.myFusebox.getApplicationData().startTime = now();
现在,在上述场景中,我希望我的代理组件将 getApplicationData() 函数直接映射到原始 myFusebox 组件(通过我的proxy()
函数)。
底层组件中的那个函数如下:
<cffunction name="getApplicationData" returntype="struct" access="public" output="false"
hint="I am a convenience method to return a reference to the application data cache.">
<cfreturn getApplication().getApplicationData() />
</cffunction>
该代理一切正常,但是,一旦我在原始 myFusebox 中的上述函数中,我收到以下错误:
Message: Variable GETAPPLICATION is undefined.
StackTrace: coldfusion.runtime.UndefinedVariableException: Variable GETAPPLICATION is undefined.
如果我this
在该函数中转储“”,它实际上会转储我的代理对象。
谁能解释这个或我做错了什么?我期待一旦函数调用在底层对象内部,它就会从那里使用自己的上下文(我的代理只是真正传递给委托)