コールドフュージョン コンポーネントでプロキシ/デリゲート パターンを使用していますが、予期しない結果が得られます (私の見解では)。以下は私のプロキシコンポーネントです - 非常に簡単です。デリゲートしたい実際のコンポーネントで 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
その関数内で " " をダンプすると、実際にはプロキシ オブジェクトがダンプされます。
誰かがこれまたは私が間違ったことを説明できますか? 関数呼び出しが基になるオブジェクト内にあると、そこから独自のコンテキストが使用されることを期待していました (私のプロキシは、実際にはデリゲートへのパススルーです)。