8

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すべての呼び出しでの新しいインスタンスを作成します。

  • dynamicMethodMyComponentでメソッドを 作成します

    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がコンポーネントを拡張する場合、「スーパー」スコープは拡張コンポーネントを参照しなくなります)。

これらのソリューションはどれも完璧ではないようです。別のコントローラーから動的関数を呼び出す方法は他にありませんか?
そして、ない場合、これらのどれが最良の解決策ですか?

どんなアドバイスでも大歓迎です、ありがとう。

4

1 に答える 1

7

良い分析。

ここでできることの1つは<cfinvoke>、ラッパー関数を使用してより厳密にエミュレートすることです。 <cfinvoke>その属性でコンポーネントパスまたはコンポーネントインスタンス(つまり、オブジェクト)のいずれかを取りCOMPONENTます。したがって、「con」は、呼び出すたびにMyComponentの新しいインスタンスを作成します。本当に有効ではありません。

ところで、ColdFusion 10は、invoke()まさにこれを実現する関数を追加しています。CF9を使用しているので、これは役に立ちません。しかし、それはおそらくこの質問にたどり着くかもしれない他の人々に関係があります。

于 2012-10-24T10:17:56.657 に答える