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()の使用はオンラインコミュニティで「悪」の評判を持っているようです。私は自分のコードを邪悪にしたくありません。cfmlラッパーを使用する
<cfinvoke>
invoke("MyComponent", myMethod, args);
長所:私は
cfinvoke
短所のすべての機能を使用できます:それはMyComponent
すべての呼び出しでの新しいインスタンスを作成します。dynamicMethod
MyComponentでメソッドを 作成します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の外部で「変数としての関数」ソリューションも試しましたが、関数はその動作コンテキストを失います。たとえば、MyComponentがコンポーネントを拡張する場合、「スーパー」スコープは拡張コンポーネントを参照しなくなります)。
これらのソリューションはどれも完璧ではないようです。別のコントローラーから動的関数を呼び出す方法は他にありませんか?
そして、ない場合、これらのどれが最良の解決策ですか?
どんなアドバイスでも大歓迎です、ありがとう。